代码之家  ›  专栏  ›  技术社区  ›  Tyler

Python线程有漏洞吗?

  •  28
  • Tyler  · 技术社区  · 16 年前

    一位可靠的程序员朋友告诉我,Python当前的多线程实现存在严重的错误,足以避免完全使用。关于这个谣言,我们能说些什么?

    6 回复  |  直到 14 年前
        1
  •  55
  •   Peter Mortensen icecrime    14 年前

    Python线程非常适合 并发I/O编程 。线程一旦阻塞等待来自文件、网络等的输入,就会从CPU中交换出来。这允许其他Python线程在其他线程等待时使用CPU。例如,这将允许您编写多线程web服务器或web爬虫。

    然而,Python线程是由 GIL 当他们进入口译员核心时。这意味着,如果两个线程都在处理数字,那么在任何给定时刻只有一个线程可以运行。这也意味着您无法利用多核或多处理器架构。

    有一些解决方案,比如使用基于C的线程库同时运行多个Python解释器。这不适合胆小的人,好处可能不值得麻烦。让我们希望在未来的版本中有一个全Python的解决方案。

        2
  •  16
  •   tzot    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
  •   Daren Thomas    13 年前

    GIL(全局解释器锁)可能是个问题,但API很好 processing 模块,为单独的进程实现线程API。我现在正在使用它(尽管是在OS X上,但还没有在Windows上进行一些测试),我印象深刻。Queue类在管理复杂性方面真的帮了我大忙!

    编辑 :从2.6版本开始,处理模块似乎已包含在标准库中( import multiprocessing ).快乐!

        4
  •  5
  •   Henrik Gustafsson    16 年前

    据我所知,没有真正的bug,但cPython中线程的性能真的很差(与大多数其他线程实现相比,但如果大多数线程都阻塞了,通常就足够了),原因是 GIL (全局解释器锁),因此它实际上是特定于实现的,而不是特定于语言的。例如,Jython不会因为使用Java线程模型而受到这种影响。

    看见 this 关于为什么从cPython实现中删除GIL并不可行的帖子,以及 this 以获得一些实用的阐述和解决方法。

    快速谷歌一下 "Python GIL" 了解更多信息。

        5
  •  2
  •   m-sharp    16 年前

    如果你想用python编码并获得出色的线程支持,你可能想看看IronPython或Jython。由于IronPython和Jython中的python代码是在上运行的。NET CLR和Java VM,它们享受着内置于这些库中的强大线程支持。除此之外,IronPython没有GIL,这个问题阻碍了CPython线程充分利用多核架构。

        6
  •  -2
  •   tslocum    16 年前

    我在几个应用程序中使用过它,只要你知道它的局限性,我从来没有听说过线程是100%可靠的。你不能同时生成1000个线程,并期望你的程序在Windows上正常运行,但是你可以很容易地编写一个工作池,只需向它提供1000个操作,并保持一切正常可控。