python线程 问题请教,怎么保证子线程执行完毕

色郎中 2017-04-04 09:11:36
参考书上的一个多线程的例子,大概如下;



def threadTest():
queue = Queue()
p = produce('pro', queue)
p.start()
for i in range(5):
c = consumer("con " + str(i) + " ", queue)
c.start()

if __name__ == '__main__':
threadTest()


声明了一个队列,用来保存文件名字;

produce ,生产者 线程 和 consumer,消费者线程;

生产者线程中,就是复制一个文件到指定目录中,文件中包含几百行文本,生产者线程只向队列里增加一个文件的名称,这个动作耗时大概1秒左右;

消费者线程,开了了5个,每个线程都可以从队列取得文件名,并根据文件名对文件进行操作,即将文件中每行都打印一下,每个线程对文件的操作耗时大概3秒左右;

但是发现一个问题:
关闭程序时,发现子线程没有执行完毕,请教如何保证子线程执行完毕?
比如生产者线程,有可能在复制时,但是没复制完毕,就突然关闭程序了,此时如何保证,让其复制完毕,并添加到队列里;

再如,消费者线程,有可能2个线程分别都从队列取了个文件,并开始打印记录了,但是可能都只打印了一半记录,此时关闭了主线程了,,又如何保证该子线程执行完毕?
...全文
620 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rainy Chan 2019-04-28
  • 打赏
  • 举报
回复
你都手动停止了当然不会打印……
色郎中 2017-04-05
  • 打赏
  • 举报
回复
引用 1 楼 uiuiy1 的回复:
线程名.join()
加了 jion()如下:

threads=[consumer('con',queue,i) for i in range(6)]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
不行啊还是,,,记录还是对不上啊; 我是用Pycharm环境测试的,程序运行时,我就直接停止运行,应该不是正常推出,是不是这样有影响打印记录不全?
屎克螂 2017-04-05
  • 打赏
  • 举报
回复
线程名.join()

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧