2024-09-26 18:04:43 发布
网友
正如标题所说,pythonstringio是否保护其内部结构以供多线程使用?在
谢谢。在
看看一个优秀的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,因为你的调用可能会以意想不到的方式重叠。在
seek
还请注意,某些方法,如writelines可以从该方法内部调用Python代码,因此在这种情况下,您可以在对writelines的单个调用中交叉获得其他输出。在
writelines
大多数标准Python对象都是这样:您可以安全地使用来自多个线程的对象,因为单个操作不会中断,但不会定义事情发生的顺序。在
看看一个优秀的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对象都是这样:您可以安全地使用来自多个线程的对象,因为单个操作不会中断,但不会定义事情发生的顺序。在
相关问题 更多 >
编程相关推荐