正如标题所说,Python cStringIO是否保护其内部结构以供多线程使用?
谢谢。
答案 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
上的每个单独文件操作不会被另一个线程中断。但 确保来自多个线程的并发文件操作不会交错。