4

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

谢谢你。

4

4 回答 4

4

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

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

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

另请注意,某些方法,例如writelines可以从方法内部调用 Python 代码,因此在这种情况下,您可能会在对writelines.

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

于 2011-05-13T12:21:41.693 回答
4

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

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

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

于 2011-05-13T12:54:46.893 回答
1

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

于 2011-05-13T12:37:16.613 回答
0

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

于 2011-05-13T12:16:49.353 回答