gpt4 book ai didi

Python 代码调用创建 OS 线程的 C 库,最终调用 Python 回调

转载 作者:太空狗 更新时间:2023-10-30 01:29:55 25 4
gpt4 key购买 nike

如果当操作系统分派(dispatch)另一个调用 Python 回调的线程时,唯一的 Python 解释器正在执行字节码 - 会发生什么?我担心这种设计的可靠性是否正确?

最佳答案

在一般情况下,C 库需要调用 PyEval_InitThreads() 以在生成任何调用 python 回调的线程之前获得 GIL。回调需要用 PyGILState_Ensure()PyGILState_Release() 包围,以确保安全执行。

但是,如果 C 库在 python C 扩展的上下文中运行,那么在一些简单的情况下完全可以安全地省略 GIL 操作。

想想这个调用序列:1) python 代码调用 C 函数 foo(),2) foo() 产生 一个而且只有一个 运行另一个 C 函数 bar() 的线程,它回调 python 代码,并且 3) foo() 总是加入或取消运行 bar( ) 返回前。

在这种情况下,省略 GIL 操作是安全的。因为 foo() 拥有 GIL(即隐式借用调用它的 python 代码)在其生命周期内,以及在 的生命周期内执行 python 回调foo() 被序列化(即只有一个回调线程和 python 代码不包含 threading)。

关于Python 代码调用创建 OS 线程的 C 库,最终调用 Python 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12116390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com