マルチスレッドプログラミングにおけるjoin関数
2437 ワード
# coding: utf-8
# join
import threading, time
def doWaiting():
print 'start waiting1: ' + time.strftime('%H:%M:%S') + "
"
time.sleep(3)
print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "
"
def doWaiting1():
print 'start waiting2: ' + time.strftime('%H:%M:%S') + "
"
time.sleep(8)
print 'stop waiting2: ', time.strftime('%H:%M:%S') + "
"
tsk = []
thread1 = threading.Thread(target = doWaiting)
thread1.start()
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1)
thread2.start()
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "
"
for tt in tsk:
tt.join()
print 'end join: ' + time.strftime('%H:%M:%S') + "
"
Joinの役割はよく知られており、スレッドが実行されるまでプロセスをブロックします.
このウィジェットは2つのスレッドthread 1とthread 2を使用しており、スレッドが実行する動作はそれぞれdoWaiting()とdoWaiting 1()であり、関数体は「開始」+スリープ3秒+印刷「終了」であり、それぞれプログラムの実行を表示するための時間を付加している.その後start()メソッドで同期して2つのスレッドの実行を開始します.次に、2つのスレッドのjoin()メソッドのループ呼び出しを開始し、print関数で開始終了のタグを作成します.私たちは主にfortt in tsk:tt.join().
join()パラメータを持たない場合は、以下のように実行します.
start waiting1: 22:54:09
start waiting2: 22:54:09
start join: 22:54:09
stop waiting1: 22:54:12
stop waiting2: 22:54:17
end join: 22:54:17
Process finished with exit code 0
2つのスレッドが並列に実行され、プロセス1が3 s後に終了し、プロセス2が8 s後に終了し、メインプロセスに戻り、「end join」の印刷が実行されることがわかります.
次にパラメータをタイムアウト2 s、すなわちttに設定.join(2)は、次のように実行されます.
start waiting1: 22:54:57
start waiting2: 22:54:57
start join: 22:54:57
stop waiting1: 22:55:00
end join: 22:55:01
stop waiting2: 22:55:05
Process finished with exit code 0
2つのスレッドが同時実行を開始し、スレッド1のjoin(2)を実行し、スレッド1が2 s実行されるとそれを無視し、スレッド2のjoin(2)を実行し、スレッド2が2 s実行されるとそれを無視し(この過程でスレッド1の実行が終了し、スレッド1の終了情報を印刷)、メインプロセスの実行を開始し、「end join」を印刷する.4 s後にスレッド2の実行が終了する.
まとめてみます.
1.joinメソッドの役割は、メインプロセス(join以降の文を実行できない)をブロックし、マルチスレッドの実行に専念することです.
2.マルチスレッドマルチjoinの場合、各スレッドのjoinメソッドを順次実行し、先頭が終了してから後の1つを実行する.
3.パラメータがない場合は、次のスレッドのjoinを実行するまでスレッドが終了するまで待機します.
4.パラメータを設定した後、スレッドが終了していないにもかかわらず、スレッドを待つ時間が長くなります.いずれにしても、後のメインプロセスを実行することができます.
最後にパラメータが2の場合のプログラム実行フローチャートを添付し、自分で描いたorzをよりよく理解できるようにします.
転載先:https://www.cnblogs.com/alan-babyblog/p/5317675.html