質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

8765閲覧

並列処理を含むプログラムを強制終了させたい

ramin

総合スコア34

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/08/24 02:52

concurrent.futuresで並列処理を行っています。
メインの文である条件を満たしたら並列処理を含むプログラムを全て強制終了させたいのですが、どうすれば良いでしょうか?
以下のプログラムではsys.exit後も並列処理funcの動作が続いてしまいます。

python

1import concurrent.futures, datetime, sys, time 2 3def func(): 4 while True: 5 print("ok") 6 time.sleep(1) 7 8executor = concurrent.futures.ThreadPoolExecutor(max_workers=2) 9executor.submit(func) 10 11count = 0 12while True: 13 count = count + 1 14 time.sleep(1) 15 if count > 5: 16 sys.exit() # funcは終了しない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ThreadPoolExecutorを使わないでthreadingで書けば、daemonに指定することで一緒に死んでくれます。処理の複雑性にもよりますが、質問文程度であればこちらでもいいと思います。

python

1import sys 2import time 3import threading 4 5def func(): 6 while True: 7 print("ok") 8 time.sleep(1) 9 10th = threading.Thread(target=func, daemon=True) 11th.start() 12 13count = 0 14while True: 15 count = count + 1 16 time.sleep(1) 17 if count > 5: 18 sys.exit() 19

投稿2019/08/24 04:35

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ramin

2019/08/26 15:31

ありがとうございました。
guest

0

ベストアンサー

以下のようにquitフラグを利用して制御するのがお行儀がよいかと思います。
参考:How do you kill Futures once they have started?

Python

1import concurrent.futures, datetime, sys, time 2 3def func(): 4 print('func start') 5 while not quit: # 終了指示されるまで 6 print('func loop') 7 time.sleep(1) 8 print('func end') 9 10print('main start') 11quit = False 12executor = concurrent.futures.ThreadPoolExecutor(max_workers=2) 13f = executor.submit(func) 14 15for _ in range(5): 16 print('main loop') 17 time.sleep(1) 18 19quit = True# 終了指示 20 21# 終了待ち 22while not f.done(): 23 time.sleep(1) 24print('main end')

投稿2019/08/24 04:05

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ramin

2019/08/26 15:31

ありがとうございました。
guest

0

多分、os._exit()するとプログラムを終了できます。もしくはos.kill(os.getpid(), 9)とか。

投稿2019/08/24 03:03

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問