【问题标题】:Python: Solving Multiple Linear Systems using ThreadsPython:使用线程求解多个线性系统
【发布时间】:2012-03-31 07:20:57
【问题描述】:

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

【问题讨论】:

标签: python math scipy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-13
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2019-01-15
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多