import queue
import threading
class Consumer(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
job = self.queue.get()
self.do_task(job)
# 如在这里加上
# If self.queue.empty():
# break
def do_task(self, task):
print ('doing task{}'.format(task))
self.queue.task_done()
def producer(tasks):
mqueue = queue.Queue()
# populate queue with tasks
for task in tasks:
mqueue.put(task)
# create 6 threads and pass the queue as its argument
for i in range(6):
mythread = Consumer(mqueue)
mythread.daemon = True # 如把这句注释掉
mythread.start()
# wait for the queue to finish
mqueue.join()
print ('all tasks completed')
if __name__ == "__main__":
tasks = 'A B C D E F'.split()
producer(tasks)
关于这段代码中mythread.daemaon = True这句,书上解释大致是要创建一个守护线程池,以便所有的线程执行完以后可以把控制权交给main函数,要是把这行注释掉main函数就结束不了。如果没有创建守护线程就要自己跟踪所有的线程以在主程序退出前通知他们结束。
我把这行注释掉运行了一下发现确实结束不了,始终执行不到print('all tasks completed')这句。我就想是不是可以像书上说的一样自己跟踪子线程,让他结束。于是我就尝试在Consumer这个类的run函数里加了个一个判断,当队列为空时就跳出循环,一跑发现然而这并没有什么卵用……主程序还是不能执行完。
在此请教各位老师,我应该怎么控制子线程结束,以使主程序执行完,又或者说自己跟踪子线程是怎么个跟踪法?非常感谢!
给你一点参考意见,可以设置一个或者多个全局变量,赋值为True,(你新建一个queue,然后判断是否为空也行),在子线程中跑的时候,一次循环判断一次,若为False则exit()。然后你想控制它结束,就需要另开一个控制线程,专门改变这些全局变量的值,以达到控制子线程关闭的目的,甚至你可以设置子线程重新开启的条件,然后控制子线程再跑起来。