ホームページ  >  記事  >  バックエンド開発  >  Python でマルチプロセッシング プールを使用して KeyboardInterrupt を適切に処理する方法

Python でマルチプロセッシング プールを使用して KeyboardInterrupt を適切に処理する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-22 14:23:03603ブラウズ

How to Gracefully Handle KeyboardInterrupt with Multiprocessing Pools in Python

マルチプロセッシング プールでのキーボード割り込み処理: Python の落とし穴

Python のマルチプロセッシング モジュールでは、KeyboardInterrupt イベントがプール内のワーカー プロセスを終了できないようです。次のコード スニペットを考えてみましょう。

<code class="python">from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()</code>

Ctrl C を押して KeyboardInterrupt を発生させると、コードはプールを正常に終了するのではなく、無期限にハングします。これは、KeyboardInterrupt が threading.Condition.wait() の呼び出しを中断できないようにする Python のバグが原因です。

回避策:

回避策の解決策は、タイムアウトを指定することです。プール操作用。

<code class="python">    results = pool.map(slowly_square, range(40))</code>

<code class="python">    results = pool.map_async(slowly_square, range(40)).get(9999999)</code>

に置き換えます。任意に大きなタイムアウトを指定すると、ブロック動作が効果的に削除され、割り込みが迅速に処理されるようになります。これにより、Ctrl C キーが押されたときにすべてのワーカー プロセスが正常に終了します。

以上がPython でマルチプロセッシング プールを使用して KeyboardInterrupt を適切に処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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