マルチスレッドプログラミングにおける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