web-dev-qa-db-ja.com

threading.Thread.join()の使用

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()

上記のコードでコメントしましたか?ソースコード(コメント付きとコメントなし)の両方を実行しましたが、出力は同じです。

24
Pratik Singhal

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およびその他の多くは、同等または同等です。さらに、いずれにしても、これらの古典を読むことを強くお勧めします。

65
Erik Allik

結合がどのように機能するかを理解できるように、コードを変更しました。このコードをコメント付きでコメントなしで実行し、両方の出力を確認します。

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()
4
aaj

関連ドキュメント が示すように、joinはスレッドが終了するまで呼び出し元を待機させます。

あなたの場合、joinはプログラムの動作を変更しないため、出力は同じです。おそらく、すべてのスレッドが終了したときにのみ、プログラムをきれいに終了するために使用されます。

1
goncalopp