Python を使用したマルチプロセッシング プールでのキーボード割り込みの処理
キーボード割り込みの処理は、並列プロセスを効果的に管理するために重要です。マルチプロセッシング ライブラリは、タスクを同時に実行できるワーカー プロセスのプールを作成する方法を提供します。ただし、これらのプロセスの実行中に KeyboardInterrupt が開始されると問題が発生します。
問題:
指定された Python コードで、プールが作成され、プールが試行されます。 Try-Except ブロックを使用して KeyboardInterrupts を処理するように作られています。ただし、Except ブロック内の対応するコードは実行されず、プログラムがハングしたままになります。
<code class="python">try: results = pool.map(slowly_square, range(40)) except KeyboardInterrupt: pool.terminate() print("You cancelled the program!") sys.exit(1)</code>
原因:
この問題は、Python のバグによって発生します。 threading.Condition.wait() の条件を待機している場合、KeyboardInterrupt は送信されません。マルチプロセッシング ライブラリでは、プールは条件変数を使用して、map() 操作の結果を待ちます。 KeyboardInterrupt が発生すると、条件変数 wait() が戻らないため、割り込みが処理されません。
解決策:
この問題を解決するには、次善策を実行します。結果を待つときにタイムアウトを指定することです。これは、map() 呼び出しを map_async().get(timeout) に置き換えることによって実現できます。タイムアウトは大きな値に設定されます。
<code class="python">results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
タイムアウトを指定することで、条件変数 wait() KeyboardInterrupt が処理されていない場合でも戻ります。これにより、Except ブロックの実行が可能になり、プールの終了と割り込みの適切な処理が可能になります。
以上がPython を使用してマルチプロセッシング プールでキーボードの割り込みを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。