Python cStringIO是线程安全的吗?

2024-09-26 18:04:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

谢谢。在


Tags: 标题内部结构pythonstringio
3条回答

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

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

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

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

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

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

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

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

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

相关问题 更多 >

    热门问题