【问题标题】:Is there such a thing as working threading in python?在 python 中是否有工作线程之类的东西?
【发布时间】:2010-12-07 20:20:47
【问题描述】:

我编写了一个漂亮的多线程脚本,当我运行它时,它在 25 个线程中的表现比直接调用线程处理程序时更差。

然后我发现了全局解释器锁。我想问,在我为这个脚本丢弃 python 并用其他东西重写之前,有没有办法在 python 中进行实际工作的多线程?

【问题讨论】:

    标签: python multithreading python-stackless


    【解决方案1】:

    另一种方法是放弃线程,转而使用 Multiprocessing 模块 (Python 2.6+),它绕过 GIL,并且具有至少类似于线程模块中的 API。

    【讨论】:

      【解决方案2】:

      现在这是一个有趣的问题 - 我认为在直接 CPython 中没有转义 GIL。

      Stackless Python 使用 microthreads 应该比 CPython 提高了“并发”性能,但我认为它不会逃脱 GIL。

      此外,根据GIL page on python.org,Jython 和 IronPython 没有 GIL。

      【讨论】:

      • Stackless python 不会利用多核,tasklet 仍然是顺序运行的。
      【解决方案3】:

      正确答案很大程度上取决于你在做什么。

      大量 CPU 密集型(和阻塞 IO 密集型)任务,例如压缩和图像渲染,通常使用本机代码完成,并且本机库通常会在它们工作时释放 GIL,从而允许并发。当您可以将 CPU 密集型工作隔离到一个狭窄的本机调用时,您将获得并发性、本机性能以及在 Python 中编写大部分代码的便利性。

      并非所有代码都具有可以在本机库中巧妙实现的小型、可隔离的计算代码块,但很多代码都有。

      【讨论】:

        【解决方案4】:

        据我所知,在 CPython(C 中 Python 的实现)中,不。 (如果我错了,请纠正我,我很想知道是否存在解决方案!)。

        您可能想对 IronPython (.NET) 或 JPython (Java/JWM) 感兴趣。我没有使用过它们,但我相信其中至少有一个支持给定执行环境的原生线程。

        【讨论】:

          【解决方案5】:

          您可以尝试multiprocessing 模块,如果它适用于您的问题。

          【讨论】:

            猜你喜欢
            • 2011-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 2018-08-24
            相关资源
            最近更新 更多