2017-02-20 31 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

您已經很好地使用了全局變量。但是,如果將兩個全局變量移到函數之外,則代碼甚至可以更具可讀性。它不會影響它們的範圍。您可以在全局變量閱讀這個常見問題太這裏,

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

啊。我看到了問題。 Python不允許在不同行上使用變量聲明和初始化。聲明並初始化就這樣在同一行的所有變量,

rand_num = random.randrange(4, 99999) 

,而不是像現在這樣,

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

從所有變量刪除全局關鍵字。然後將所有變量與全局關鍵字放在所有函數定義之外

+0

所以我玩了一下。我正要避免將輸出緩衝區聲明爲全局變量,但不是'rand_num'。會發生什麼情況是,函數2中的'rand_num'賦值在函數3中使用時不會更新該變量。如果我真的想避免全局變量,我可以用getter和setter聲明一個Rand_num類。我想我可能會那樣做。 – Eric