6

という名前のモジュールがありますmulti.py。単純に multi.py をスクリプトとして実行したい場合、Windows でのクラッシュ (無数のプロセスの生成) を回避するための回避策は、マルチプロセッシング コードを以下に配置することです。

if __name__ == '__main__':

ただし、別のスクリプトからモジュールとしてインポートして呼び出しようとしていますmulti.start()。これはどのように達成できますか?

# multi.py
import multiprocessing

def test(x):
    x**=2

def start():
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()-2)
    pool.map(test, (i for i in range(1000*1000)))
    pool.terminate()
    print('done.')

if __name__ == '__main__':
    print('runs as a script,',__name__)
else:
    print('runs as imported module,',__name__)

これは私のtest.py実行です:

# test.py
import multi
multi.start()
4

2 に答える 2

7

あなたが何を求めているのかよくわかりません。これが無限に多くのプロセスを生成するのを防ぐために何もする必要はありません。Windows XP で実行しました --- ファイルをインポートして実行しましたmulti.start()--- 数秒で問題なく完了しました。

保護を行う必要がある理由はif __name__=="__main__"、Windows では、ターゲット関数を実行するためにマルチプロセッシングがメイン スクリプトをインポートする必要があるためです。つまり、そのファイルの最上位モジュール コードが実行されます。この問題は、最上位のモジュール コード自体が新しいプロセスを生成しようとした場合にのみ発生します。あなたの例では、最上位のモジュール コードはマルチプロセッシングを使用していないため、無限のプロセス チェーンはありません。

編集:今、私はあなたが求めているものを手に入れました。保護する必要はありませんmulti.py。それが何であれ、メインスクリプトを保護する必要があります。クラッシュが発生している場合は、メイン スクリプトmulti.start()でトップ レベルのモジュール コードを実行していることが原因です。スクリプトは次のようにする必要があります。

import multi
if __name__=="__main__":
    multi.start()

メインスクリプトでは常に「保護」が必要です。

于 2012-07-06T18:48:23.003 に答える
0
if __name__ == '__main__':
  print('runs as a script,',__name__)
else:
  print('runs as imported module,',__name__)
于 2012-07-06T18:38:17.860 に答える