我制作了一个简单的python程序,下面是源代码。
# -*- coding: utf-8 -*-
import sys
from multiprocessing import Process, Queue
def worker(q):
test = q.get()
print str(test) + ' success!'
if __name__ == "__main__":
test = ['a','e','f','d',1,2]
print test
q = Queue()
q.put(test)
p0 = Process(target=worker, args=(q,))
p0.start()
p0.join()
print 'python exit!!'
这是成功输出。
['a', 'e', 'f', 'd', 1, 2]
['a', 'e', 'f', 'd', 1, 2] success!
python exit!!
但是当我运行如下所示的程序时,它只运行两个进程。
# -*- coding: utf-8 -*-
import sys
from multiprocessing import Process, Queue
def worker(q):
test = q.get()
print str(test) + ' success!'
if __name__ == "__main__":
test = ['a','e','f','d',1,2]
print test
q = Queue()
q.put(test)
p0 = Process(target=worker, args=(q,))
p1 = Process(target=worker, args=(q,))
p0.start()
p1.start()
p0.join()
p1.join()
print 'python exit!!'
它的输出。
['a', 'e', 'f', 'd', 1, 2]
['a', 'e', 'f', 'd', 1, 2] success!
程序没有结束!问题是什么。队列有什么问题吗?当我使用
运行时p0 =进程(target = worker,args =(test,))
而不是q,没有问题。
答案 0 :(得分:0)
https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue.get:
get([block[, timeout]])
从队列中删除并返回一个项目。如果可选的args块为True(默认值)且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Queue.Empty异常。否则(块为False),如果一个项立即可用,则返回一个项,否则引发Queue.Empty异常(在这种情况下忽略超时)。
因此,当您致电p0.start()
时,它会删除队列中的所有项目。调用p1.start()
后,方法q.get()
必须等到队列项可用。