2024-04-26 03:54:10 发布
网友
问:由于python使用了“GIL”,python是否能够同时运行其单独的线程?
信息:
在阅读了this之后,我不太确定python是否能够利用多核处理器。尽管python做得很好,但想到它会缺乏如此强大的能力,感觉真的很奇怪。所以觉得不确定,我决定问这里。如果我写的程序是多线程的,它能在多个内核上同时执行吗?
CPython(Python的经典和流行实现)不能有多个线程同时执行Python字节码。这意味着计算绑定程序将只使用一个内核。在C扩展(如numpy)中发生的I/O操作和计算可以同时操作。
Python的其他实现(如Jython或PyPy)的行为可能不同,我不太清楚它们的细节。
通常的建议是使用多个进程而不是多个线程。
Python线程不能利用许多核心。这是因为在python的C实现(cPython)中有一个称为GIL(全局解释器锁)的内部实现细节,这几乎可以肯定是您所使用的。
解决方法是为此开发的multiprocessing模块http://www.python.org/dev/peps/pep-0371/。
multiprocessing
文档:http://docs.python.org/library/multiprocessing.html
(或使用并行语言。)
答案是“是的,但是…”
但是当您使用常规线程进行并发时,cPython不能。
您可以使用^{}、^{}或^{}之类的方法将并行工作拆分为另一个进程
或者可以使用类似Jython或IronPython的东西来使用没有GIL的替代解释程序。
较软的解决方案是使用不与GIL冲突的库来执行繁重的CPU任务,例如^{}可以在不保留GIL的情况下完成繁重的工作,这样其他python线程就可以继续。也可以这样使用^{}库。
如果您不做CPU绑定的工作,那么可以完全忽略GIL问题(某种程度上),因为python在等待IO时不会获取GIL。
CPython(Python的经典和流行实现)不能有多个线程同时执行Python字节码。这意味着计算绑定程序将只使用一个内核。在C扩展(如numpy)中发生的I/O操作和计算可以同时操作。
Python的其他实现(如Jython或PyPy)的行为可能不同,我不太清楚它们的细节。
通常的建议是使用多个进程而不是多个线程。
Python线程不能利用许多核心。这是因为在python的C实现(cPython)中有一个称为GIL(全局解释器锁)的内部实现细节,这几乎可以肯定是您所使用的。
解决方法是为此开发的
multiprocessing
模块http://www.python.org/dev/peps/pep-0371/。文档:http://docs.python.org/library/multiprocessing.html
(或使用并行语言。)
答案是“是的,但是…”
但是当您使用常规线程进行并发时,cPython不能。
您可以使用^{} 、^{} 或^{} 之类的方法将并行工作拆分为另一个进程
或者可以使用类似Jython或IronPython的东西来使用没有GIL的替代解释程序。
较软的解决方案是使用不与GIL冲突的库来执行繁重的CPU任务,例如^{} 可以在不保留GIL的情况下完成繁重的工作,这样其他python线程就可以继续。也可以这样使用^{} 库。
如果您不做CPU绑定的工作,那么可以完全忽略GIL问题(某种程度上),因为python在等待IO时不会获取GIL。
相关问题 更多 >
编程相关推荐