【问题标题】:Does calling a c function via ctypes in python release the GIL during execution of the C code在执行 C 代码期间,通过 python 中的 ctypes 调用 c 函数是否会释放 GIL
【发布时间】:2021-07-24 00:58:15
【问题描述】:

我想从 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?

【问题讨论】:

  • 请注意,您不必包装参数。 ctypes 通过.argtypes 知道参数类型,所以fun.sleep(5) 工作正常。
  • @MarkTolonen 感谢您的提示!

标签: python ctypes gil python-cffi


【解决方案1】:

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

此类的实例行为类似于CDLL 实例,除了 Python GIL 在函数调用期间释放

有些人可能会说,这是在 ctypes.CFUNCTYPE 中以更明确的形式表述的。

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

附带说明,如果 fun.sleep 被多次调用(例如在循环中或其他情况下),则在 PythonC 用于每次调用,在这种情况下,您可能需要考虑在 C 中编写整个循环。

【讨论】:

  • 非常清楚,谢谢!仍然非常出乎意料的是,这没有用 CDLL 记录。
  • 不客气!嗯,CDLLCFUNCTYPE 是耦合的。
【解决方案2】:

如果直接在 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

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 2014-06-15
    • 2019-10-21
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多