以下代码在 python 2.7 和 3.3 中引发异常并打印 123。
from multiprocessing import Queue
class Pool(object):
def __init__(self):
self.q = Queue()
p = Pool()
p.q.put(p)
print(123)
这实际上是某种竞争条件,如下所示:
yuv@yuvpad2:~/$ python3.3 t.py
123
Traceback (most recent call last):
File "/home/yuv/Downloads/Python-3.3.0/Lib/multiprocessing/queues.py", line 249, in _feed
yuv@yuvpad2:~/$
完整的错误是RuntimeError: Queue objects should only be shared between processes through inheritance
并且回溯根本没有解释它是如何/在哪里发生的。问题的根源是队列中的对象不能引用队列。我真正的用例实际上是一个工作对象和一个池对象,其中一个工作人员报告它完成工作到池的Queue
. 所以我希望工人将自己送回给工人Queue
。
尽管多线程对我的情况很有效,但我不使用的原因Queue.Queue
是因为在 Python 2.7 中存在一个错误,它使 queue.get() 忽略 Ctrl-C,这很烦人。
有没有办法干净地做这个模式?