通过 python 中的 ctypes 调用 c 函数是否会在执行 C 代码期间释放 GIL

Does calling a c function via ctypes in python release the GIL during execution of the C code

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

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

调用fun.sleep时GIL是否释放?

根据[Python.Docs]: class ctypes.PyDLL(name, mode=DEFAULT_MODE, handle=None)强调是我的):

Instances of this class behave like CDLL instances, except that the Python GIL is not released during the function call,

有人可能会说这是对 ctypes.CFUNCTYPE.

的更明确的表述

因此,您问题的答案是:

附带说明一下,如果 fun.sleep 被多次调用(比如在循环中或其他情况下),[=] 之间的编组数据会“丢失”时间20=]Python 和 C 每次调用,在这种情况下,您可能需要考虑在 C[ 中编写整个循环=28=].

如果直接在 CLL 文档中启动它会很好,但下面的文章提供了一个令人信服的测试:http://caswenson.com/2009_06_13_bypassing_the_python_gil_with_ctypes.html

编辑: 我说得太早了:CFUNCTYPE 文档对于发布 GIL 非常明确:https://docs.python.org/3/library/ctypes.html#ctypes.CFUNCTYPE