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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

1回答

4369閲覧

Pythonのマルチスレッドでjoinでメインスレッドをブロックせずにループさせる。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

1クリップ

投稿2017/08/24 12:00

Python 3.6系です。

このバージョンのPythonでサブのスレッドを実行して,

thread.join();
でメインスレッドをブロックせずにサブのスレッドが完了するまでメインスレッドをループさせたいと考えています。

ただ,ネット上で動作プログラムを調べてみるとほとんどがjoin()でメインスレッドをブロックさせているものばかりだったのですが
以下のようなプログラムでスレッドが完了するまでループさせる方法としては妥当でしょうか?

python

1 2""" 3マルチスレッドでjoinでメインスレッドをブロックせずに 4サブのスレッドが終了するまでメインスレッドには別のことをさせたい。 5""" 6import threading 7import time 8class MyThreadClass(threading.Thread): 9 10 #コンストラクタのオーバーライド 11 def __init__ (self, argument): 12 super().__init__(); 13 self.argument = argument; 14 self.fp = open("./thread.dat", "wb"); 15 pass 16 17 #runメソッド オーバーライド 18 def run(self): 19 print("コンストラクタの引数=>{}<=".format(self.argument)); 20 for i in range(10): 21 self.dummy_method(i); 22 time.sleep(3); 23 print("runメソッド実行完了"); 24 25 def dummy_method(self, i): 26 self.fp.write("実行順序 => {0}番目 \n".format(i).encode("UTF-8")); 27 28 #joinメソッドのオーバーライド 29 #作成したスレッドの完了時にはNoneではなく1を返却したい 30 def join(self, takes): 31 print(super().join(takes)); 32 print("マルチスレッド実行完了"); 33 self.fp.close() 34 return 1; 35 36 37th = MyThreadClass("マルチスレッドの開始"); 38th.start(); 39 40 41while(True) : 42 #スレッドが生存中の場合は常にTrueが返却される 43 if (th.is_alive() == True): 44 #print("スレッド生存中"); 45 #サブのスレッドが動いている限りメインスレッドでは別処理をさせたい。 46 pass 47 else: 48 if th.join() == 1: 49 break; 50 51print("マルチスレッドループ終了"); 52 53

上記のぷろぐらむではjoin()メソッドでNoneではなくてintの1を返したいと
仮定してjoinメソッドもオーバーライドしています。
windows端末では上記のソースは問題なくうごいたのですが
何か問題のある記述をしていたら指摘していただきたいです

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

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

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

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

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

can110

2017/08/25 06:44

参考までに「join()でメインスレッドをブロック」コードのURLを追記いただけないでしょうか?
guest

回答1

0

ベストアンサー

「サブのスレッドが動いている限りメインスレッドでは別処理をさせたい」というのはごく自然な要求です。そのためにマルチスレッドさせます。提示コードも問題ないと思います。
ただ、提示された条件であれば以下のループでよいです。(サブ)スレッド死ねばjoin()は不要なので。

Python

1while(th.is_alive()) : 2 # メインの処理を行う 3 4print("マルチスレッドループ終了");

また「join()でメインスレッドをブロック」するコードは、先にメイン側が終了するようなケース、具体的には以下のようなコードではないかと思います。
この場合は、サブ側の終了を待ってメインを終了させます。

Python

1while( True): 2 # メインの処理 3 # ... 4 5 if メインの終了条件: 6 break 7 8th.join() # サブの終了を待ってメインを終了させる。すでにサブが死んでてもjoin()呼び出してもよい。

投稿2017/08/25 06:40

編集2017/08/25 07:01
can110

総合スコア38260

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問