我目前尝试使用线程编写一个更大的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%可靠的结果。对于这些,你需要真正的并发感知结构,比如队列。对于简单的示范,你有时可以不使用它们。 –