[解決済み] pythonのマルチプロセッシングプールでキーボード割り込み
2022-04-30 05:39:44
質問
Python のマルチプロセッシングプールで KeyboardInterrupt イベントを処理するにはどうすればよいですか?以下は簡単な例です。
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()
上記のコードを実行すると
KeyboardInterrupt
を押したときに発生します。
^C
しかし、その時点でプロセスは単にハングアップし、私はそれを外部で殺す必要があります。
を押せるようにしたい。
^C
を実行すると、すべてのプロセスが優雅に終了します。
解決方法は?
これはPythonのバグです。 threading.Condition.wait() で条件待ちの場合、KeyboardInterrupt が送信されない。 再現してください。
import threading
cond = threading.Condition(threading.Lock())
cond.acquire()
cond.wait(None)
print "done"
KeyboardInterrupt の例外は wait() が戻るまで配信されず、wait() は決して戻らないので、割り込みは発生しない。 KeyboardInterrupt はほぼ確実に条件待ちを中断するはずです。
なお、タイムアウトを指定した場合はそうならず、cond.wait(1)はすぐに割り込みを受信してしまいます。 そこで、回避策として、タイムアウトを指定する方法があります。 そのためには、以下のように置き換えます。
results = pool.map(slowly_square, range(40))
と
results = pool.map_async(slowly_square, range(40)).get(9999999)
などを使用します。
関連
-
Python Decorator 練習問題
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み] マルチプロセシングpool.mapを複数の引数で使用する方法
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] マルチプロセシングプールに似たスレッディングプール?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pythonを使ったオフィス自動化コード例
-
Python jiabaライブラリの使用方法について説明
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Pythonショートビデオクローラーチュートリアル
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み】ValueError: xとyは同じサイズでなければならない