首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python cStringIO是线程安全的吗?

Python cStringIO是线程安全的吗?
EN

Stack Overflow用户
提问于 2011-05-13 20:10:53
回答 4查看 2.4K关注 0票数 4

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

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-13 20:54:47

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-05-13 20:21:42

我假设您谈论的是Python的CPython实现。

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

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-05-13 20:37:17

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5991605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档