【发布时间】:2014-10-09 01:54:24
【问题描述】:
正如您从标题中知道的那样,我正在尝试将 PriorityQueue 与多处理一起使用。更准确地说,我想制作共享的 PriorityQueue,写了一些代码,但它没有按我的预期运行。
看代码:
import time
from multiprocessing import Process, Lock
from Queue import PriorityQueue
def worker(queue):
lock = Lock()
with lock:
for i in range(100):
queue.put(i)
print "worker", queue.qsize()
pr_queue = PriorityQueue()
worker_process = Process(target = worker, args = (pr_queue,))
worker_process.start()
time.sleep(5) # nope, race condition, you shall not pass (probably)
print "main", pr_queue.qsize()
得到以下输出:
worker 100
main 0
发生了什么以及如何以正确的方式做我想做的事? 谢谢。
【问题讨论】:
-
multiprocessing只能传输pickle-able 对象,而PriorityQueue不能。在此处查看 unutbu 和 rockportrocker 的答案:stackoverflow.com/questions/8804830/… -
@jojo 在 Unix 上,
PriorityQueue在这种情况下不会被腌制,它通过fork继承。但它仍然不起作用,因为PriorityQueue并不意味着在进程之间共享。 worker 和 parent 最终会得到对象的不同副本,因此一个进程更改它不会影响另一个进程。
标签: python queue multiprocessing priority-queue