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?
根据[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被多次调用(例如在循环中或其他情况下),则每次调用在Python和C之间编组数据时都会“损失”时间,在这种情况下,您可能需要考虑编写整个在C中循环。
| 归档时间: |
|
| 查看次数: |
1228 次 |
| 最近记录: |