问题 是否有任何内置函数阻止I / O不允许其他线程运行?


我在文档的“警告”部分中看到了这个有趣的声明 thread 模块今天:

并非所有可能阻止等待I / O的内置函数都允许其他功能   线程运行。 (最受欢迎的(time.sleep()file.read(),    select.select())按预期工作。)

几乎所有其他地方我都见过Python线程,我们总是假设所有执行I / O的内置函数都会释放GIL,这意味着其他线程可以在函数阻塞时运行。据我所知,I / O操作阻止其他线程的唯一风险是,如果它是由一个忽略释放GIL的错误的C扩展。

所以,这是来自的声明 thread docs其实是真的吗?是否存在不释放GIL的内置阻塞I / O操作?到目前为止,我还没有找到任何具体的例子。


12824
2017-07-18 18:21


起源

也许这是具体的实施。也许CPython没有非GIL释放的I / O功能,但只要睡眠/读/选仍然可以释放GIL,其他版本都可以使用它们。 - Kevin
是的,我相信@Kevin是正确的。它只是意味着扩展的开发人员不需要发布GIL,这是扩展内部的良好实践。开发人员必须知道他们的功能是纯粹等待I / O并以特定方式编程GIL。因此,它不能保证。 - beiller
@beiller该文件特别指出了“内置函数”,这对我来说这并不是在考虑C扩展。 - dano
这个陈述看起来很古老:我可以在SVN历史中找到它,至少可以追溯到1994年1月,在Guido的一次提交中,有消息“重组图书馆文档”。我无法追踪它。 - Mark Dickinson
@MarkDickinson谢谢。创建 issue22006。 - dano


答案:


这是 来自Guido van Rossum的官方消息 在这一个:

不是我最疯狂的梦想,我可以期待那个说法   20年后仍然在文档中。 :-)请摆脱它。

所以我的问题的答案是“不”。


10