我正在学习python多线程和队列。以下内容创建了一组线程,这些线程将数据通过队列传递到另一个线程进行打印:
import time
import threading
import Queue
queue = Queue.Queue()
def add(data):
return ["%sX" % x for x in data]
class PrintThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
data = self.queue.get()
print data
self.queue.task_done()
class MyThread(threading.Thread):
def __init__(self, queue, data):
threading.Thread.__init__(self)
self.queue = queue
self.data = data
def run(self):
self.queue.put(add(self.data))
if __name__ == "__main__":
a = MyThread(queue, ["a","b","c"])
a.start()
b = MyThread(queue, ["d","e","f"])
b.start()
c = MyThread(queue, ["g","h","i"])
c.start()
printme = PrintThread(queue)
printme.start()
queue.join()
但是,我只看到第一个帖子的数据打印出来:
['aX', 'bX', 'cX']
然后别的什么,但程序没有退出。我必须杀死进程让它退出。
理想情况下,在每个MyThread
进行数据处理并将结果放入队列后,该线程应该退出吗?同时PrintThread
应该采取队列中的任何内容并打印出来。
在所有MyThread
个线程完成并且PrintThread
线程已完成处理队列中的所有内容后,程序应该干净地退出。
我做错了什么?
修改:
如果每个MyThread
线程需要一段时间来处理,有没有办法保证PrintThread
线程在它退出之前等待所有MyThread
线程完成?
这样,打印线程肯定会处理队列中的所有可能数据,因为所有其他线程都已经退出。
例如,
class MyThread(threading.Thread):
def __init__(self, queue, data):
threading.Thread.__init__(self)
self.queue = queue
self.data = data
def run(self):
time.sleep(10)
self.queue.put(add(self.data))
上述修改将在将任何内容放入队列之前等待10秒。打印线程将运行,但我认为它已经过早退出,因为队列中还没有数据,所以程序没有打印出来。
答案 0 :(得分:0)
您的PrintThread
不会循环,而是仅打印出一个队列项,然后停止运行。
因此,队列永远不会为空,queue.join()
语句将阻止主程序终止
将run()
的{{1}}方法更改为以下代码,以便处理所有队列项:
PrintThread