作为回调从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。到源的链接是一个完美的引用。谢谢