次のコードは例外をスローし、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
です。
私の場合はマルチスレッドがうまく機能しますが、使用しない理由Queue.Queue
は、Python 2.7 に queue.get() が Ctrl-C を無視するバグがあるためです。
このパターンをきれいに行う方法はありますか?