Python:使用线程解决多个线性系统

时间:2012-03-14 19:15:22

标签: python math scipy

我试图使用python和scipy使用线程来解决多个线性系统。对于python线程,我是一个绝对的初学者。我附上了代码,它提炼了我想要完成的事情。此代码有效但执行时间实际上随着totalThreads的增加而增加。我的猜测是,spsolve被视为一个关键部分,实际上并不是同时运行的。

我的问题如下:

  • spsolve线程安全吗?
  • 如果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()

1 个答案:

答案 0 :(得分:3)

您应该首先理解的是,与直觉相反,Python的线程模块不会让您利用多个核心。这是由于称为全局解释器锁(GIL)的东西,它是标准cPython实现的关键部分。有关详细信息,请参阅此处:What is a global interpreter lock (GIL)?

您应该考虑使用多处理模块,它通过旋转多个独立的Python进程来绕过GIL。这有点难以使用,因为不同的进程具有不同的内存空间,因此您不能只在所有进程之间共享一个线程安全的对象,并期望该对象在所有进程之间保持同步。以下是多处理的一个很好的介绍:http://www.doughellmann.com/PyMOTW/multiprocessing/