10

I create 100 child processes

proc_list = [
    Process(target = simulator, args=(result_queue,))
    for i in xrange(100)]

and start them

for proc in proc_list: proc.start()

Each process puts into the result_queue (instance of multiprocessing.Queue) 10000 tuples after doing some processing.

def simulate(alg_instance, image_ids, gamma, results,
                     simulations, sim_semaphore):
  (rs, qs, t_us) =  alg_instance.simulate_multiple(image_ids, gamma,
                                             simulations)
  all_tuples = zip(rs, qs, t_us)
  for result in all_tuples:
    results.put(result)
  sim_semaphore.release()

I should be (?) getting 1000000 tuples at the queue, but after various runs I get these (sample) sizes: 14912 19563 12952 13524 7487 18350 15986 11928 14281 14282 7317

Any suggestions?

4

3 に答える 3

22

マルチプロセッシングの問題に対する私の解決策は、ほとんどの場合 Manager オブジェクトを使用することです。公開されたインターフェースは同じですが、基礎となる実装ははるかに単純で、バグが少なくなっています。

from multiprocessing import Manager
manager = Manager()
result_queue = manager.Queue()

試してみて、問題が解決しないかどうかを確認してください。

于 2012-07-11T23:33:07.313 に答える
7

multiprocessing.Queue は、そのドキュメントでスレッドセーフであると言われています。ただし、Queue でプロセス間通信を行う場合は、multiprocessing.Manager().Queue() を使用する必要があります。

于 2016-09-25T00:46:39.763 に答える