5

プロジェクトでマルチプロセッシングを使用しています。結果をキューに入れるワーカー関数があります。すべて正常に動作します。しかし、x のサイズが大きくなると (私の場合、x は配列です)、何かがおかしくなりました。これが私のコードの簡略版です:

def do_work(queue, x):
    result = heavy_computation_function(x)
    queue.put(result)   # PROBLEM HERE

def parallel_something():
    queue = Queue()
    procs = [Process(target=do_work, args=i) for i in xrange(20)]
    for p in procs: p.start()
    for p in procs: p.join()

    results = []
    while not queue.empty():
        results.append(queue.get)

    return results

システム モニターで Python プロセスが動作していることがわかりますが、何かが発生し、すべてのプロセスが実行されていますが、何もしていません。これは、ctrl-D を入力したときに得られるものです。

    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt

私はいくつかのテストを行います。実際、結果をキューに入れないと問題が発生するように見えますが、結果を入れないとすべてが機能しますが、目的はありません。

4

2 に答える 2

5

ほとんどの場合、デッドロックが発生しています。

プログラミングガイドラインから:

これは、キューを使用するときはいつでも、プロセスが結合される前に、キューに置かれたすべてのアイテムが最終的に削除されることを確認する必要があることを意味します。そうしないと、アイテムをキューに入れているプロセスが終了することを確認できません。非デーモンプロセスは自動的に結合されることにも注意してください。

このページには、可能な修正も提案されています。プロセスが結合されていない場合でも、プロセスがリソースを「占有」しているわけではないことに注意してください。これは、プロセスが操作を完了した後に (おそらくlocksを使用して) キューに入れられたデータを取得し、後でプロセスに参加できることを意味します。

于 2014-12-15T20:26:46.143 に答える
3

うーん、python の Queue モジュールのバグのようです。実際に使って..

from multiprocessing import Manager

queue = Manager().Queue()

..すべてが機能しますが、理由はまだわかりません..:)

于 2012-11-30T20:07:37.317 に答える