我必须使用修复时间步骤来解决ODE系统。在每个时间步,我必须计算许多类似方程的输出(我正在编程神经网络,我必须计算每个神经元的值。这些神经元由ODE系统表示)。因此,我想并行循环内的计算。我尝试使用线程包,但我应该做错了,因为它不起作用...(在下面的代码中,为了清晰起见,我跳过了输入的生成)
class EBNMCPU(threading.Thread):
def __init__(self, threadID, Ts, OnDir):
self.threadID = threadID
self.Neuron=NM.EBN(Ts,Dir=OnDir)
threading.Thread.__init__(self)
def run(self,Glu=[np.array([1.0],dtype='float'),0.0],GlyOPN=np.array([1.0],dtype='float'),GlyIBN=np.array([0.0],dtype='float')):
threadLock.acquire()
self.Neuron.NextStep(Glu, GlyOPN, GlyIBN)
threadLock.release()
def getOutput(self):
return self.Neuron.getOutput()
if __name__ == '__main__':
Ts=np.array( [0.005] , dtype=float)
threadLock = threading.Lock()
EBN=[]
for ii in np.arange(0,10):
EBN.append(EBNMCPU(ii,Ts,OnDir=0.0))
for tc in EBN:
tc.start()
for ii in np.arange(0,NSample):
for tc in EBN:
tc.run([np.array([AllY[ii,1]]),0.0],np.array([AllY[ii,2]]),np.array([AllY[ii,3]]))
for tc in EBN:
tc.join()
问题是我在系统管理器中没有看到任何并行活动......
感谢您的意见/帮助,
皮尔
答案 0 :(得分:1)
问题是我的系统管理器中没有看到任何并行活动
这是因为由于global interpreter lock,Python线程不会分布在多个CPU /核心上。使用multiprocessing
或joblib
编写并行Python程序。
答案 1 :(得分:0)
你直接调用run()
,它在同一个线程中运行代码。 run()
必须没有参数。您应该在构造对象时传递每个参数,然后调用start()
以在新线程中运行它。