2017-02-20 12 views
0

私はスレッディングを使用する課題に取り組んでいます。スレッド間で変数を共有するなどの問題を処理するためにグローバル変数を使用します。私はグローバル変数の使用は一般的には推奨されないことを知っています。だから私はこれがグローバル変数の適切な使用かどうか尋ねたいと思っていました。このスレッドの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() 

答えて

0

グローバル変数をよく使用しています。しかし、2つのグローバル変数を関数外に移動すると、コードを読みやすくすることさえできます。スコープには影響しません。あなたは、あまりにもここでグローバル変数に

https://docs.python.org/2/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python

+0

スレッドを開始するときに 'NameError:[var] not defined'が返されました。メインブロックで初期化しようとしましたが、それでも動作しませんでした。 – Eric

0

ああこのFAQを読むことができます。私は問題を見る。 Pythonでは、さまざまな行に変数の宣言や初期化を行うことはできません。

global rand_num 
    rand_num = random.randrange(4, 99999) 

は、すべての変数からグローバルキーワードを削除し、これを好き宣言し、このように同じ行にすべての変数を初期化、

rand_num = random.randrange(4, 99999) 

をしていません。次に、すべての関数定義の外にglobalキーワードを含むすべての変数を配置します。

+0

だから私は少しそれと一緒に遊んだ。私は、グローバル変数として出力バッファを宣言しないようにしようとしていましたが、 'rand_num'は出力しませんでした。何が起こるのでしょうか?function2の 'rand_num'の代入は、function3で使われているときにその変数を更新しません。本当にグローバル変数を避けたいのであれば、ゲッターとセッターでRand_numクラスを宣言できます。私はそれをするかもしれないと思う。 – Eric

関連する問題