私はスレッディングを使用する課題に取り組んでいます。スレッド間で変数を共有するなどの問題を処理するためにグローバル変数を使用します。私はグローバル変数の使用は一般的には推奨されないことを知っています。だから私はこれがグローバル変数の適切な使用かどうか尋ねたいと思っていました。このスレッドのpythonスクリプトでグローバル変数を使用するのは良い方法ですか?
ここにコードがあります。 function1()とfunction2()で宣言されたグローバル変数が見つかります。
from threading import Thread
from time import sleep
import random
import Queue
def getNextPrime(num):
flag = False
while(flag == False):
num = num + 1
flag = True
for i in range(2, num):
if num % i == 0:
flag = False
break
# if we get here num should equal our next prime
return num
def function1(self):
i = 100
global output_buffer
output_buffer = Queue.Queue()
while True:
output_buffer.put("Thread 1: " + str(i))
i -= 1
sleep(1)
def function2(self):
while True:
global rand_num
rand_num = random.randrange(4, 99999)
output_buffer.put("Thread 2: " + str(rand_num))
sleep(1)
def function3(self):
while True:
output_buffer.put("Thread 3: " + str(rand_num/2.5))
sleep(1)
def function4(self):
prime_num = 1
for i in range(0, 20):
output_buffer.put("Thread 4: " + str(prime_num))
prime_num = getNextPrime(prime_num)
sleep(1)
# if I don't handle output like this I get weird behavior like two threads printing on the same line
def buffer_dump(self):
while True:
while not output_buffer.empty():
print output_buffer.get()
sleep(1)
if __name__ == "__main__":
random.seed()
thread1 = Thread(target=function1, args=(1,))
thread2 = Thread(target=function2, args=(1,))
thread3 = Thread(target=function3, args=(1,))
thread4 = Thread(target=function4, args=(1,))
output_thread = Thread(target=buffer_dump, args=(1,))
thread1.start()
output_thread.start()
sleep(2)
thread2.start()
sleep(2)
thread3.start()
sleep(2)
thread4.start()
スレッドを開始するときに 'NameError:[var] not defined'が返されました。メインブロックで初期化しようとしましたが、それでも動作しませんでした。 – Eric