Python cStringIO是线程安全的吗?

时间:2011-05-13 12:10:53

标签: python thread-safety stringio

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

谢谢。

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

我假设你在谈论Python的CPython实现。

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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