複数のスレッドに依存し、スレッド間でデータを共有するプログラムをPythonで構築しようとしています。global キーワードを使用してこれを回避しようとしていますが、これまでのところどこにも行きません。
簡単な例 (以下のコード) として、私の main() 関数は 1 つのスレッド thread1 を生成します。このスレッドは変数 count にアクセスできるはずです (この場合は単に出力するため)。同時に、main() はこの変数を反復し、スレッド 1 はカウントの変化を確認できるはずです。ここにいくつかの自己完結型コードがあります:
import threading
import time
class myThread (threading.Thread):
def __init__(self, threadID):
self.threadID = threadID
threading.Thread.__init__(self)
def run(self):
global count
for i in range(10):
print "count is now: ", count, " for thread ", self.threadID, "\n"
time.sleep(5)
def main():
global count
count = 0
# spawn one or more threads
thread1 = myThread(1)
thread1.start()
for i in range(20):
time.sleep(2)
count = count + 1
# wait for thread1 to finish
thread1.join()
main()
Python でスレッドについて読んだとき、global を使用する以外にこれを行う方法が見つかりませんでした。しかし、global について読むと、たいていの人は、正当な理由からめったに使用すべきではないと言い、Python から完全に削除すべきだと考える人さえいます。したがって、thread1 に main() がカウントを反復したことを「受動的に」検出し、その新しい値にアクセスする別の方法があるかどうか疑問に思っています。たとえば、私は python とポインターについてあまり知りません (python にも存在しますか?) が、いずれにせよ、これはまさに global が達成することだと思います。
理想的には、count が繰り返されるたびに main() から thread1 メソッドを呼び出して新しい self.count を設定できるようにすることができますが、thread1 にはブロックしている run() メソッドがあるため、別のメソッドがないとこれを行う方法がわかりません。複雑すぎるように見えるスレッド1内の独立したスレッド。