我目前嘗試使用線程編寫一個更大的python程序,並遇到了數組不必被聲明爲全局的問題。Python中的線程和全局變量 - 數組和標準變量之間的區別?
import numpy as np
import threading
import time
import ctypes
import multiprocessing
import random
import os
def child1():
#global var
starttime = time.time()
for ite in range(10):
#data_np[ite] = time.time()-starttime
#print data_np[ite]
var += 1
print var
time.sleep(1)
def child2():
#global var
for ite in range(10):
#print data_np
print var
print "\n"
time.sleep(1)
os.system("clear")
data_np = np.zeros(shape=(10), dtype="float")
var = 0
thread1 = threading.Thread(target=child1)
thread2 = threading.Thread(target=child2)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
由於var未被聲明爲全局變量,因此上述代碼將產生錯誤消息。 Unnotement
global var
產生一個可執行腳本,打印var的值兩次。 但是用numpy的陣列data_np,沒有聲明需要
global data_np
時。腳本將運行。 我不明白這種行爲。有人可以對此作出解釋嗎?
謝謝你的回答!它爲底層結構提供了一個很好的第一見解。 – kM00n
也許爲了使事情更清楚,代碼只是一個例子,以澄清我遇到的數組和標準變量被區別對待的問題。在我的主程序中,我想要創建兩個進程,一個進行繪圖,另一個進程包含兩個線程。一個用於與外部設備通信的線程,另一個用於處理用戶輸入。我嘗試通過僅分別向一個進程或線程寫入變量或數組來避免併發性。到目前爲止,這在OSX下得到了解決。 – kM00n
是的。如果你只從一個線程寫入結構,這大大簡化了事情。由於「競賽條件」,這並不意味着你會得到100%可靠的結果。對於這些,你需要真正的併發感知結構,比如隊列。對於簡單的示範,你有時可以不使用它們。 –