从 C 调用 python 函数作为回调。处理 GIL 的正确方法是什么?

2023-11-23

我在用着cytpes包装 C api。其中一个 api 函数允许您注册回调。我在用着CFUNCTYPEto 指定函数的类型并创建一个实例CFUNCTYPE来自我的 python 库的用户提供的 python 函数,然后我将其传递给 C 函数(使用ctypes api).

我知道ctypes调用释放GIL。我想知道当 C 库函数调用我的 python 回调函数时会发生什么。做ctypes重新获得GIL?

The 文档 says:

Note:确保保留对以下内容的引用CFUNCTYPE()对象,只要它们是从 C 代码中使用的。ctypes不,如果不这样做,它们可能会被垃圾收集,从而在进行回调时使您的程序崩溃。 另请注意,如果在 Python 控制之外创建的线程中调用回调函数(例如,通过调用回调的外部代码),ctypes每次调用时都会创建一个新的虚拟 Python 线程。此行为对于大多数用途来说都是正确的,但这意味着存储的值threading.local即使这些调用是从同一个 C 线程进行的,也不会在不同的回调中生存。

它没有说任何关于GIL。这是否意味着一切都为我处理了?


The CThunkObject回调中引用的_objects属性有pcl_execC 库调用的函数指针。这段代码调用closure_fcn参考 thunk 以及调用args和一个指向内存的指针来存储结果。闭包函数依次调用_CallPythonObject, 与 thunk 的restype, setfunc, callable, converters, and flags作为参数。第一件事_CallPythonObject确实是打电话PyGILState_Ensure获取 GIL。即使这是 Python 第一次看到当前线程,这也有效。

换句话说,一切都为你处理好了。只需保留对回调的引用即可保持 thunk 的引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C 调用 python 函数作为回调。处理 GIL 的正确方法是什么? 的相关文章

随机推荐

  • 如何在通过 webpack 加载单个捆绑的 javascript 文件时显示进度条?

    问题是关于 webpack 的 将几乎所有内容打包到一个在index html中加载的bundle js后 bundle js文件大约有2M 需要几秒钟才能加载 我想显示一个进度条 指示加载进度 同时隐藏所有内容 仅启用用户交互并在加载完成
  • 如何使用 Tensorflow 对象检测 API 启用多 GPU 训练

    我正在尝试使用 TensorFlow 对象检测 API 执行多 GPU 训练 我在 NVIDIA SMI 中看到的是 实际上只使用了 1 个 GPU 提供的其他 3 个 GPU 已加载 GPU 进程 但内存使用量为 300MB 利用率始终为
  • EF 5.0 和动态连接字符串?

    现在有一件事让我抓狂 我的 数据库优先 EF Model 需要动态连接字符串 服务器的 IP 地址可能偶尔会更改 因此 在较旧的 EF 版本中 您可以通过构造函数传递连接字符串 但在 5 0 中似乎不可能 到目前为止我所读到的内容是 您可以
  • Msiexec:安装失败时自动回滚到以前的版本

    在静默模式下使用 msiexec 安装 MSI 文件时 是否可以使其自动化 以便在安装失败时回滚到以前的版本 假设安装时已经安装了较旧的应用程序版本 Yes 恢复旧的应用程序版本通过安装失败时的回滚实际上是Windows Installer
  • 创建 NSManagedObject 而不保存? [复制]

    这个问题在这里已经有答案了 可能的重复 存储但不将 NSManagedObject 保存到 CoreData 我需要创建一个 NSManagedObject 而不保存它 我该怎么做 我想这样做的原因是应用程序有一个设置 用户可以在其中输入详
  • 为什么 JAXBgenerateElementProperty=false 没有达到预期的效果?

    我正在使用以下绑定文件运行 wsimport 任务
  • Lua 中的 math.pow 替代品?

    我无法使用math pow x y in Lua 不知道为什么 提示语法错误 math sin f and math cos f 然而有效 还有其他选择吗math pow in Lua Lua s math pow 如文档所述 该函数从版本
  • 在 TabActivity 的单个选项卡中重新启动活动?

    我有一个 TabActivity 每个选项卡都指向一个子活动 这很好用 有没有什么聪明的方法来刷新活动选项卡之一 例如 我只想 重新启动 选项卡 3 中的活动 除了构建对活动本身的刷新支持 或清除所有选项卡并重新创建所有选项卡之外 不确定是
  • 仅通过过滤器传输 STDERR

    在 bash 中 有什么方法可以在将 STDERR 与 STDOUT 统一之前通过过滤器通过管道传输 STDERR 吗 也就是说 我想要 STDOUT gt terminal file whatever STDERR filter 而不是
  • openWithDefaultApplication 在应用程序文件夹中的文件上失败

    如果我尝试打开放置在air的应用程序文件夹中的文件 我只会收到 错误 3000 非法路径名 如果该文件位于应用程序文件夹之外的其他位置 则它可以工作 private var file File File documentsDirectory
  • 在 TF 估计器中使用 Keras 模型

    我想使用其中包含的预构建 keras 模型之一 vgg inception resnet 等 tf keras application用于特征提取 以节省我一些训练时间 在估计器模型函数内部执行此操作的正确方法是什么 这就是我目前所拥有的
  • 从 Pandas Groupby Dataframe 创建等高线图

    我有以下熊猫数据框 In 66 hdf size Out 66 a b 0 0 0 21004 0 1 119903 0 2 186579 0 3 417349 0 4 202723 0 5 100906 0 6 56386 0 7 608
  • 为什么在 React Hooks 中排序后数组没有更新?

    我是反应新手 状态数组在排序函数后仅更新一次 为什么第二次触发排序功能后没有再次更新 const cases setCases useState 1 2 3 4 5 let sortDown true let sorted function
  • 在任务栏中显示 JDialog 不起作用

    我使用下面的代码在任务栏上显示 JDialog 并且在 JDK 1 6 中完美工作 public class test8 public static void main String args Runnable r new Runnable
  • 单个流浪文件中的多个提供者?

    我有一个构建本地虚拟机的流浪文件 我想添加 EC2 提供商 并可以选择配置本地虚拟机或 EC2 上的虚拟机 我可以在同一个 Vagrantfile 中为多个提供程序创建配置 并以某种方式选择运行时的配置吗vagrant up 您可以使用mu
  • 如何使用“fcntl()”锁定和解锁 pid 文件

    我在网络上进行了研究 甚至在堆栈溢出上进行了研究 以便找到使用的示例fcntl 锁定和解锁 pid 文件 var run myapp pid 但我没有找到明确的例子 你能给我举一个使用的例子吗fcntl 锁定和解锁pid文件 锁不应被阻止
  • 检测用户何时单击 UITextView 中的粘贴按钮

    我在尝试更改剪切 复制 粘贴行为时遇到了很大的问题UITextView 我想要实现的是 检测用户何时将一些文本粘贴到UITextView 当我检测到这一点时 我将检查数据并做我的事情 根据文件 我了解到UIResponder 所以我创建了一
  • 父级和第一个/最后一个子级的边距折叠如何工作?

    MDN says 如果没有边框 内边距 内联内容或清除来分离margin top一个块的margin top它的第一个子块 或者没有边框 填充 内联内容 height 最小高度 or 最大高度来分离margin bottom一个块的marg
  • 为什么我的 sourceDirectories 设置在 sbt 中没有效果?

    我正在读 SBT入门指导 该页面显示sourceDirectories设置为例 为了亲自尝试 我将以下内容放入我的build sbt文件 用于基本的 hello world 项目 sourceDirectories in Compile S
  • 从 C 调用 python 函数作为回调。处理 GIL 的正确方法是什么?

    我在用着cytpes包装 C api 其中一个 api 函数允许您注册回调 我在用着CFUNCTYPEto 指定函数的类型并创建一个实例CFUNCTYPE来自我的 python 库的用户提供的 python 函数 然后我将其传递给 C 函数