私はPythonでかなり大規模なプロジェクトに取り組んでおり、メインサービスの速度が低下しないように、計算集約型のバックグラウンドタスクの1つを別のコアにオフロードする必要があります。multiprocessing.Queue
ワーカープロセスの結果を伝達するために使用するときに、明らかに奇妙な動作に遭遇しました。比較の目的でathreading.Thread
とaの両方に同じキューを使用すると、スレッドは正常に機能しますが、大きなアイテムをキューに入れた後、プロセスは参加できません。multiprocessing.Process
観察:
import threading
import multiprocessing
class WorkerThread(threading.Thread):
def __init__(self, queue, size):
threading.Thread.__init__(self)
self.queue = queue
self.size = size
def run(self):
self.queue.put(range(size))
class WorkerProcess(multiprocessing.Process):
def __init__(self, queue, size):
multiprocessing.Process.__init__(self)
self.queue = queue
self.size = size
def run(self):
self.queue.put(range(size))
if __name__ == "__main__":
size = 100000
queue = multiprocessing.Queue()
worker_t = WorkerThread(queue, size)
worker_p = WorkerProcess(queue, size)
worker_t.start()
worker_t.join()
print 'thread results length:', len(queue.get())
worker_p.start()
worker_p.join()
print 'process results length:', len(queue.get())
これはで正常に機能することを確認しましsize = 10000
たが、でハングしworker_p.join()
ますsize = 100000
。multiprocessing.Process
インスタンスが入れることができるものに固有のサイズ制限はありmultiprocessing.Queue
ますか?それとも、ここで明らかな根本的な間違いを犯していますか?
参考までに、Ubuntu10.04でPython2.6.5を使用しています。