0

PyDev で multiprocessing モジュールを使用するコンポーネントで作業しようとしましたが、コードを実行すると OS で数百の Python プロセスが生成され、マシンが強制終了されるという問題がありました。run()の代わりにコード呼び出しを行ったところ、問題なくstart()動作しました (ただし、実際にプロセスを生成するのはすべてシングル スレッドであったことを除きstart()ます)。つまり、私のコードは、少なくとも、無限に生成するような非常識なことをしていないことがわかります。プロセスか何か。さらに、何が起きているかを確認するために、小さなテスト コードをまとめました。

from multiprocessing import Process
import time

def create_processes(num_processes, method, *args):

    processes = []
    for i in range(num_processes):
        processes.append(Process(target=method, args=args))
    return processes

def start_all(processes, stagger):

    for process in processes:
        process.start()
        if stagger:
            time.sleep(stagger)

processes = create_processes(2, time.sleep, 4)
start_all(processes, 0)

これを cli で実行すると、正常に動作します。タイムアウト後に終了する 2 つの新しいプロセスを生成します。ただし、PyDev で実行すると、約 600 のプロセスが生成されます (または、少なくとも、マシンが応答しなくなる前にタスク マネージャーが表示する数です)。少しデバッグを行ったところProcess.start()、ライン上で爆発しているようself._popen = Popen(self)です。

少し調べてみたのですが、特に関係ありそうなものは見つけられませんでした。CLI は、join()すべてのstart()ed プロセスを別のマネージャーに自動的に転送して、手綱を維持していますか? join()すべてのプロセスに対してコードにスレッドが必要ですか? PyDev は、ロギングと制御を維持しようと試みていますか? 何か他のことが起こっていますか?

4

1 に答える 1

3

これがコードの開始点である場合if __name__ == '__main__'、サブプロセスが独自のサブプロセスを開始しないようにするために、最後の 2 行を次のようにラップする必要があります。

if __name__ == '__main__':
    processes = create_processes(2, time.sleep, 4)
    start_all(processes, 0)
于 2012-06-28T19:49:37.963 に答える