我试图使用线程使用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()
Run Code Online (Sandbox Code Playgroud)
您应该了解的第一件事是,与直觉相反,Python 的线程模块不会让您利用多核。这是由于称为全局解释器锁 (GIL) 的原因,它是标准 cPython 实现的关键部分。请参阅此处了解更多信息:什么是全局解释器锁 (GIL)?
您应该考虑使用多处理模块,它通过启动多个独立的 Python 进程来绕过 GIL。这使用起来有点困难,因为不同的进程有不同的内存空间,因此您不能只在所有进程之间共享线程安全对象并期望该对象在所有进程之间保持同步。这是对多处理的精彩介绍:http://www.doughellmann.com/PyMOTW/multiprocessing/