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