新しいconcurrent.futures
モジュール (Python 2 バックポートも備えている) を使用して、単純なマルチスレッド I/O を実行しています。このモジュールを使用して開始されたタスクを完全に強制終了する方法がわかりません。
私が見ている動作を再現する次の Python 2/3 スクリプトを確認してください。
#!/usr/bin/env python
from __future__ import print_function
import concurrent.futures
import time
def control_c_this():
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
future1 = executor.submit(wait_a_bit, name="Jack")
future2 = executor.submit(wait_a_bit, name="Jill")
for future in concurrent.futures.as_completed([future1, future2]):
future.result()
print("All done!")
def wait_a_bit(name):
print("{n} is waiting...".format(n=name))
time.sleep(100)
if __name__ == "__main__":
control_c_this()
このスクリプトの実行中は、通常の Control-C キーボード割り込みを使用して完全に強制終了することは不可能に見えます。私はOS Xで実行しています。
- Python 2.7 では
kill
、コマンド ラインからスクリプトを強制終了する必要があります。Control-C は単に無視されます。 - Python 3.4 では、Control-C を 2 回押すと機能しますが、多くの奇妙なスタック トレースがダンプされます。
私がオンラインで見つけたほとんどのドキュメントは、古いthreading
モジュールでスレッドをきれいに殺す方法について語っています。ここではどれも当てはまらないようです。
concurrent.futures
また、モジュール内で提供されているもの (Executor.shutdown()
や など) を停止するすべてのメソッドはFuture.cancel()
、Future がまだ開始されていないか完了している場合にのみ機能しますが、この場合は無意味です。すぐに未来を中断したい。
私の使用例は単純です。ユーザーが Control-C を押すと、適切に動作するスクリプトと同様に、スクリプトはすぐに終了する必要があります。それだけです。
では、使用時にこの動作を取得する適切な方法は何concurrent.futures
ですか?