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

6
我正在尝试使用 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()

这个问题可以在scicomp上得到欢迎。 - Aron Ahmadia
1个回答

3
你需要理解的第一件事是,Python的线程模块不会让你利用多个核心,这似乎与直觉相反。这是由于全局解释器锁(GIL)的存在,它是标准cPython实现的关键部分。有关更多信息,请参见什么是全局解释器锁(GIL)?
相反,你应该考虑使用multiprocessing模块,它通过启动多个独立的Python进程来避免GIL的影响。这可能会更加困难,因为不同的进程具有不同的内存空间,因此你不能只是在所有进程之间共享线程安全对象,并期望对象在所有进程之间保持同步。这里有一个很好的介绍multiprocessing的链接:http://www.doughellmann.com/PyMOTW/multiprocessing/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接