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

作为回调从C调用python函数。处理GIL的正确方法是什么?,python,callback,ctypes,gil,Python,Callback,Ctypes,Gil,我正在使用cytpes包装一个C api。其中一个api函数允许您注册回调。我使用CFUNCTYPE指定函数的类型,并从python库的用户提供的python函数中创建一个CFUNCTYPE实例,然后将其传递给C函数(使用ctypesapi调用) 我知道ctypes调用会释放GIL。我想知道当C库函数调用我的python回调函数时会发生什么。ctypes是否重新获取GIL 报告说: 注意:确保保留对CFUNCTYPE()对象的引用,只要它们是从C代码中使用的ctypes不会,如果不这样做,它们可

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

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

报告说:

注意:确保保留对
CFUNCTYPE()
对象的引用,只要它们是从C代码中使用的
ctypes
不会,如果不这样做,它们可能会被垃圾收集,在回调时会使程序崩溃。 另外,请注意,如果在Python控制之外创建的线程中调用回调函数(例如,由调用回调的外部代码调用),
ctypes
在每次调用时创建一个新的伪Python线程。这种行为在大多数情况下都是正确的,但这意味着使用
threading.local
存储的值不会在不同的回调中存在,即使这些调用是从同一个C线程发出的

它没有提到任何关于
GIL
。这是否意味着这一切都是为我处理的?

回调的
\u objects
属性中引用的具有C库调用的
pcl\u exec
函数指针。此代码使用对thunk的引用,加上调用
args
和指向内存的指针来存储结果。闭包函数依次调用thunk的
restype
setfunc
callable
转换器
标志作为参数。
\u CallPythonObject
做的第一件事是调用获取GIL。即使这是Python第一次看到当前线程,这种方法仍然有效


换句话说,一切都由你来处理。只要保留对回调的引用,就可以引用thunk。

到源的链接是一个完美的引用。谢谢