我试图使用python和scipy使用线程来解决多个线性系统。对于python线程,我是一个绝对的初学者。我附上了代码,它提炼了我想要完成的事情。此代码有效但执行时间实际上随着totalThreads的增加而增加。我的猜测是,spsolve被视为一个关键部分,实际上并不是同时运行的。
我的问题如下:
我一直在网上搜索答案,但没有运气。也许,我只是使用错误的关键字。感谢大家的帮助。
def Worker(threadnum, totalThreads):
for i in range(threadnum,N,totalThreads):
x[:,i] = sparse.linalg.spsolve( A, b[:,i] )
threads = []
for threadnum in range(totalThreads):
t = threading.Thread(target=Worker, args=(threadnum, totalThreads))
threads.append(t)
t.start()
for threadnum in range(totalThreads): threads[threadnum].join()
答案 0 :(得分:3)
您应该首先理解的是,与直觉相反,Python的线程模块不会让您利用多个核心。这是由于称为全局解释器锁(GIL)的东西,它是标准cPython实现的关键部分。有关详细信息,请参阅此处:What is a global interpreter lock (GIL)?
您应该考虑使用多处理模块,它通过旋转多个独立的Python进程来绕过GIL。这有点难以使用,因为不同的进程具有不同的内存空间,因此您不能只在所有进程之间共享一个线程安全的对象,并期望该对象在所有进程之间保持同步。以下是多处理的一个很好的介绍:http://www.doughellmann.com/PyMOTW/multiprocessing/