【发布时间】:2010-12-07 20:20:47
【问题描述】:
我编写了一个漂亮的多线程脚本,当我运行它时,它在 25 个线程中的表现比直接调用线程处理程序时更差。
然后我发现了全局解释器锁。我想问,在我为这个脚本丢弃 python 并用其他东西重写之前,有没有办法在 python 中进行实际工作的多线程?
【问题讨论】:
标签: python multithreading python-stackless
我编写了一个漂亮的多线程脚本,当我运行它时,它在 25 个线程中的表现比直接调用线程处理程序时更差。
然后我发现了全局解释器锁。我想问,在我为这个脚本丢弃 python 并用其他东西重写之前,有没有办法在 python 中进行实际工作的多线程?
【问题讨论】:
标签: python multithreading python-stackless
另一种方法是放弃线程,转而使用 Multiprocessing 模块 (Python 2.6+),它绕过 GIL,并且具有至少类似于线程模块中的 API。
【讨论】:
现在这是一个有趣的问题 - 我认为在直接 CPython 中没有转义 GIL。
Stackless Python 使用 microthreads 应该比 CPython 提高了“并发”性能,但我认为它不会逃脱 GIL。
此外,根据GIL page on python.org,Jython 和 IronPython 没有 GIL。
【讨论】:
正确答案很大程度上取决于你在做什么。
大量 CPU 密集型(和阻塞 IO 密集型)任务,例如压缩和图像渲染,通常使用本机代码完成,并且本机库通常会在它们工作时释放 GIL,从而允许并发。当您可以将 CPU 密集型工作隔离到一个狭窄的本机调用时,您将获得并发性、本机性能以及在 Python 中编写大部分代码的便利性。
并非所有代码都具有可以在本机库中巧妙实现的小型、可隔离的计算代码块,但很多代码都有。
【讨论】:
据我所知,在 CPython(C 中 Python 的实现)中,不。 (如果我错了,请纠正我,我很想知道是否存在解决方案!)。
您可能想对 IronPython (.NET) 或 JPython (Java/JWM) 感兴趣。我没有使用过它们,但我相信其中至少有一个支持给定执行环境的原生线程。
【讨论】:
您可以尝试multiprocessing 模块,如果它适用于您的问题。
【讨论】: