ホームページ  >  記事  >  バックエンド開発  >  Python を使用してマルチプロセッシング プールでキーボードの割り込みを処理する方法

Python を使用してマルチプロセッシング プールでキーボードの割り込みを処理する方法

DDD
DDDオリジナル
2024-10-22 16:35:02893ブラウズ

How to Handle Keyboard Interruptions in Multiprocessing Pools with Python?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。