2

このコードは無限のプロセスを開始し、その後PCをクラッシュさせます。

import multiprocessing

def f(process_name):
    print process_name, 'says hi'

p1 = multiprocessing.Process(None,f,'1',('1st',))
p1.start()

コンソールでは、「1st say hi」が何度も表示され、タスクマネージャーでは、多数の通訳者が開始しているのがわかります。これは、PyDevEclipse内およびコマンドライン内から実行しました。同じ結果です。

私が得たもう1つの結果は、単一のpythonインタープリターを実行していることです(ただし、別のインタープリターを非常に高速に起動して生成します)。そのため、タスクマネージャー内でそれを強制終了できませんでした(ハンドルが無効です)。しかし、それはプロセッサの100%を使い果たしていました。

私はJavaスレッディングAPIに慣れており、モジュールマルチプロセッシングは、Javaのコピーであるスレッディングモジュールと同様のインターフェイスを備えていると主張しています。

プロセスが死なないのはなぜですか?これが単一のスレッドを生成し、物を印刷して消滅させるだけで、私は何が欠けていますか?

Thx、君たちは支配する!

4

2 に答える 2

8

if __name__ == "__main__":初期化コードをブロックにまとめる必要があります。

__main__フォークが新しいインタープリターを開始した後、Pythonはモジュールを再度実行します。この構成によって保護されていないものはすべて、再度実行されます。これはあなたが見る効果を生み出します。

于 2013-02-13T23:25:51.613 に答える
0

あなたがコマンドでそうするように彼らに命じるまで、私はプロセスが死ぬとは思わないmyProcess.exit.set()。コードを編集して、次のようにします。

import multiprocessing

def f(process_name):
    print process_name, 'says hi'

p1 = multiprocessing.Process(None,f,'1',('1st',))
p1.start()
p1.exit.set()

ただし、問題が発生する可能性があるため、大規模なプログラムではこれを行いません。詳細については、こちらをご覧ください。また、これに関するドキュメントにアクセスすることをお勧めします。

于 2013-02-13T23:33:46.673 に答える