pythonでマルチスレッドを初めて使用し、スレッドモジュールを使用してマルチスレッドを学習しようとしています。マルチスレッドの非常に簡単なプログラムを作成しましたが、threading.Thread.join
方法。
ここに私が作ったプログラムのソースコードがあります
import threading
val = 0
def increment():
global val
print "Inside increment"
for x in range(100):
val += 1
print "val is now {} ".format(val)
thread1 = threading.Thread(target=increment, args=())
thread2 = threading.Thread(target=increment, args=())
thread1.start()
#thread1.join()
thread2.start()
#thread2.join()
使用するとどのような違いがありますか
thread1.join()
thread2.join()
上記のコードでコメントしましたか?ソースコード(コメント付きとコメントなし)の両方を実行しましたが、出力は同じです。
thread1.join()
への呼び出しは、_thread1
_が終了するまで、呼び出しを行っているスレッドをブロックします。 wait_until_finished(thread1)
のようなものです。
例えば:
_import time
def printer():
for _ in range(3):
time.sleep(1.0)
print "hello"
thread = Thread(target=printer)
thread.start()
thread.join()
print "goodbye"
_
プリント
_hello
hello
hello
goodbye
_
— .join()
呼び出しがない場合、goodbye
が最初に来て、3 * hello
になります。
また、Python)のスレッドは Global Interpreter Lock と呼ばれるものがあるため、CPU処理能力の観点から追加のパフォーマンスを提供しないことに注意してください。潜在的にブロックする(IO、ネットワークなど)および時間のかかるタスク(例:数値計算)を生成して他のタスク用にメインスレッドを解放するのに役立ちます。複数のコアまたはCPUを活用することはできません。そのため、multiprocessing
サブプロセスを使用しますが、threading
と同等のAPIを公開します。
PLUG:...また、上記の理由により、並行性に興味がある場合は、罰金を調べることもできますGeventと呼ばれるライブラリ。本質的には、スレッド化がはるかに簡単になり、並行処理に関連するバグが発生しにくくなります(同時に、多数の同時アクティビティがある場合)。また、Twisted、Eventlet、Tornadoおよびその他の多くは、同等または同等です。さらに、いずれにしても、これらの古典を読むことを強くお勧めします。
結合がどのように機能するかを理解できるように、コードを変更しました。このコードをコメント付きでコメントなしで実行し、両方の出力を確認します。
val = 0
def increment(msg,sleep_time):
global val
print "Inside increment"
for x in range(10):
val += 1
print "%s : %d\n" % (msg,val)
time.sleep(sleep_time)
thread1 = threading.Thread(target=increment, args=("thread_01",0.5))
thread2 = threading.Thread(target=increment, args=("thread_02",1))
thread1.start()
#thread1.join()
thread2.start()
#thread2.join()
関連ドキュメント が示すように、join
はスレッドが終了するまで呼び出し元を待機させます。
あなたの場合、join
はプログラムの動作を変更しないため、出力は同じです。おそらく、すべてのスレッドが終了したときにのみ、プログラムをきれいに終了するために使用されます。