![]() |
1
55
Python线程非常适合 并发I/O编程 。线程一旦阻塞等待来自文件、网络等的输入,就会从CPU中交换出来。这允许其他Python线程在其他线程等待时使用CPU。例如,这将允许您编写多线程web服务器或web爬虫。 然而,Python线程是由 GIL 当他们进入口译员核心时。这意味着,如果两个线程都在处理数字,那么在任何给定时刻只有一个线程可以运行。这也意味着您无法利用多核或多处理器架构。 有一些解决方案,比如使用基于C的线程库同时运行多个Python解释器。这不适合胆小的人,好处可能不值得麻烦。让我们希望在未来的版本中有一个全Python的解决方案。 |
![]() |
2
16
Python的标准实现(通常称为CPython,因为它是用C编写的)使用操作系统线程,但由于 Global Interpreter Lock ,一次只允许一个线程运行Python代码。但在这些限制范围内,线程库是健壮的,并且被广泛使用。 如果你想使用多个CPU核,有几个选项。一种是同时使用多个python解释器,正如其他人提到的那样。另一种选择是使用不使用GIL的Python的不同实现。两个主要选项是 Jython 和 IronPython . Jython是用Java编写的,现在已经相当成熟,尽管仍然存在一些不兼容问题。例如,web框架 Django does not run perfectly yet ,但越来越近了。Jython是 great for thread safety ,出来 better in benchmarks 并且有一个 cheeky message for those wanting the GIL . IronPython使用。NET框架,用C#编写。兼容性正在达到这样的阶段 Django can run on IronPython (至少作为演示)并且有 guides to using threads in IronPython . |
![]() |
3
9
GIL(全局解释器锁)可能是个问题,但API很好
编辑
:从2.6版本开始,处理模块似乎已包含在标准库中(
|
![]() |
4
5
据我所知,没有真正的bug,但cPython中线程的性能真的很差(与大多数其他线程实现相比,但如果大多数线程都阻塞了,通常就足够了),原因是 GIL (全局解释器锁),因此它实际上是特定于实现的,而不是特定于语言的。例如,Jython不会因为使用Java线程模型而受到这种影响。 看见 this 关于为什么从cPython实现中删除GIL并不可行的帖子,以及 this 以获得一些实用的阐述和解决方法。 快速谷歌一下 "Python GIL" 了解更多信息。 |
![]() |
5
2
如果你想用python编码并获得出色的线程支持,你可能想看看IronPython或Jython。由于IronPython和Jython中的python代码是在上运行的。NET CLR和Java VM,它们享受着内置于这些库中的强大线程支持。除此之外,IronPython没有GIL,这个问题阻碍了CPython线程充分利用多核架构。 |
![]() |
6
-2
我在几个应用程序中使用过它,只要你知道它的局限性,我从来没有听说过线程是100%可靠的。你不能同时生成1000个线程,并期望你的程序在Windows上正常运行,但是你可以很容易地编写一个工作池,只需向它提供1000个操作,并保持一切正常可控。 |
![]() |
user107586 · 如何处理等待句柄不会导致无限循环? 6 月前 |
![]() |
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 6 月前 |
![]() |
BenjiFB · C#内存缓存:在一次操作中追加到列表? 6 月前 |
![]() |
András Takács · Python多线程问题 10 月前 |
|
András Takács · Python多线程错误 10 月前 |