在Python中通过ctypes调用ac函数是否在C代码执行期间释放GIL

4 python ctypes gil python-cffi

我想从 python 调用一些 c 函数来提高代码的性能。但我无法在网上找到当我使用 ctypes 库调用 C 函数时 GIL 是否被释放。举个简单的例子:

from ctypes import *
fun = cdll.LoadLibrary("libc.so.6")
fun.sleep.argtypes = [c_uint]
fun.sleep(c_uint(5))
Run Code Online (Sandbox Code Playgroud)

GIL 是否在调用期间被释放fun.sleep

Cri*_*ati 5

根据[Python.Docs]:ctypes.CFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False)重点是我的):

返回的函数原型创建使用标准 C 调用约定的函数。该函数将在调用期间释放 GIL

另外(为了链接*FUNCTYPE*DLL),[Python.Docs]: class ctypes.PyDLL(name, mode=DEFAULT_MODE, handle=None)重点仍然是我的):

此类的实例的行为类似于CDLL实例,只是在函数调用期间不会释放 Python GIL

因此,您的问题的答案是:

附带说明一下,如果fun.sleep被多次调用(例如在循环中或其他情况下),则每次调用在PythonC之间编组数据时都会“损失”时间,在这种情况下,您可能需要考虑编写整个在C中循环。