【问题标题】:Is Python cStringIO thread-safe?Python cStringIO 线程安全吗?
【发布时间】:2011-08-24 21:33:13
【问题描述】:

正如标题所说,Python cStringIO 是否保护其内部结构以供多线程使用?

谢谢。

【问题讨论】:

    标签: python thread-safety stringio


    【解决方案1】:

    看看优秀的work on explaining GIL,然后注意cStringIO 是纯粹用C 编写的,它的调用不会释放GIL。

    这意味着正在运行的线程在 read()/write() 期间不会主动切换(使用当前的虚拟机实现)。 (操作系统会抢占线程,但其他 Python 线程将无法获取 GIL。)

    查看源代码:Python-2.7.1/Modules/cStringIO.c 没有提及内部保护。如有疑问,请查看来源:)

    【讨论】:

      【解决方案2】:

      我假设您说的是 Python 的 CPython 实现。

      在 CPython 中有一个全局解释器锁,这意味着一次只能执行一个 Python 代码线程。因此,用 C 编写的代码也将有效地成为单线程代码,除非它显式释放全局锁。

      这意味着,如果您有多个 Python 线程都同时使用 cStringIO,则不会有任何问题,因为一次只能激活一次对 cStringIO 方法的调用,而 cStringIO 永远不会释放锁。但是,如果您直接从在锁定环境之外运行的 C 代码调用它,您将遇到问题。此外,如果您做的事情比阅读或写作更复杂,您也会遇到问题,例如如果您开始使用seek,因为您的通话可能会以意想不到的方式重叠。

      另请注意,某些方法(例如 writelines)可以从方法内部调用 Python 代码,因此在这种情况下,您可能会在对 writelines 的单个调用中得到交错的其他输出。

      对于大多数标准 Python 对象都是如此:您可以安全地使用来自多个线程的对象,因为单个操作不会中断,但不会定义事情发生的顺序。

      【讨论】:

      • 不知道是不是CPython实现,我说的是这个docs.python.org/library/stringio.html#module-cStringIOpython对象。是吗?
      • @Emilio:如果您不使用 CPython,您可能会知道。 CPython 是用 C 编写的 Python 的实现,几乎每个使用 Python 的人都在使用它。
      • 我知道这与提出的问题不同,但您可以使用通过 ctypes 导入的 C 函数绕过 GIL。 caswenson.com/past/2009/6/13/… 我发现它信息丰富:)
      • @tMC 是的,这在调用与 Python 无关的 C 函数时很有用,但是如果您调用任何 Python API 函数,则需要锁定 GIL,否则会发生非常糟糕的事情. ('Any' 不包括一些特殊情况,例如要求 GIL 的功能)
      【解决方案3】:

      它是“线程安全的”,就像文件操作一样(这意味着——不多)。您正在使用的 Python 实现具有Global Interpreter Lock (GIL),这将保证cStringIO 上的每个单独的文件操作不会被另一个线程中断。但是,这保证来自多个线程的并发文件操作不会被交错。

      【讨论】:

      • cStringIO 根本不处理操作系统文件,所以即使结论正确,论证也是无效的
      • @janislaw:谁说过系统文件? stringIO 暴露文件接口,你对它进行文件操作。
      • 是的,你完全正确。我把你提到的“文件操作”误认为是实现——而不是接口。
      【解决方案4】:

      不,它目前不是线程安全的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-15
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        相关资源
        最近更新 更多