gpt4 book ai didi

python - 从 C 调用 python 函数作为回调。处理 GIL 的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 15:04:14 24 4
gpt4 key购买 nike

我正在使用 cytpes 来包装 C api。其中一个 api 函数允许您注册回调。我正在使用 CFUNCTYPE 来指定函数的类型,并从我的 python 库的用户提供的 python 函数创建 CFUNCTYPE 的实例,然后我将其传递给 C函数(使用 ctypes api 调用)。

我知道 ctypes 调用会释放 GIL。我想知道当 C 库函数调用我的 python 回调函数时会发生什么。 ctypes 是否重新获取 GIL

documentation说:

Note: Make sure you keep references to CFUNCTYPE() objects as long as they are used from C code. ctypes doesn’t, and if you don’t, they may be garbage collected, crashing your program when a callback is made. Also, note that if the callback function is called in a thread created outside of Python’s control (e.g. by the foreign code that calls the callback), ctypes creates a new dummy Python thread on every invocation. This behavior is correct for most purposes, but it means that values stored with threading.local will not survive across different callbacks, even when those calls are made from the same C thread.

它没有说明任何关于 GIL 的内容。这是否意味着一切都为我处理了?

最佳答案

CThunkObject回调的 _objects 属性中引用的对象具有 C 库调用的 pcl_exec 函数指针。此代码调用 closure_fcn带有对 thunk 的引用,加上调用 args 和一个指向内存的指针来存储结果。闭包函数依次调用 _CallPythonObject ,thunk 的 restypesetfunccallableconvertersflags 作为参数。 _CallPythonObject 做的第一件事是调用 PyGILState_Ensure获得 GIL。即使这是 Python 第一次看到当前线程,这仍然有效。

换句话说,这一切都为您处理。只需保留对回调的引用以保持对 thunk 的引用。

关于python - 从 C 调用 python 函数作为回调。处理 GIL 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34686826/

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