c++ - Python C API - 停止执行(稍后继续执行)

标签 c++ python api profile execution

1) 当 python 解释器从特定函数返回时,我想使用 Python C API 中的分析函数来捕获它。

2) 我想暂停 python 解释器,将执行发送回在我的 C++ 程序中调用解释器的函数,最后将执行返回给 python 解释器,在它停止的代码行上启动它。我想在执行属于 python 的时间之间维护全局变量和局部变量。

第 1 部分我已经完成了。第 2 部分是我的问题。我不知道要保存什么以便返回执行,或者如何根据保存的数据返回执行。

根据我可以从 python API 文档中得到的信息,我将不得不保存执行框架的某些部分,但我还没有找到任何东西。一些额外的问题... PyFrameObject 究竟包含什么?令人惊讶的是,Python API 文档从未解释过这一点。

最佳答案

如果我理解你的问题,你有一个调用 python 的 C++ 程序。当 python 完成执行一个函数时,你想暂停解释器并从 C++ 代码停止的地方开始。一段时间后,您的 C++ 程序需要重新调用 python,并让 python 解释器从它停止的地方开始。

我不认为你可以用一个线程很容易地做到这一点。在您暂停解释器之前,堆栈看起来像这样:

[ top of stack ]
[ some interpreter frames ]
[ some c++ frames ] 

要暂停解释器,您需要保存解释器帧,然后跳回到最顶层的 C++ 帧。然后要取消暂停,您需要恢复解释器帧,并将堆栈向上跳到您离开的地方。跳跃是可行的(参见 http://en.wikipedia.org/wiki/Setjmp.h ),但保存和恢复堆栈更难。我不知道有 API 可以执行此操作。

但是您可以使用两个线程来完成此操作。在 C++ 程序开始时创建的线程(称为线程 1)运行 C++ 代码,并创建线程 2 以运行 Python 解释器。

最初(当我们运行 C++ 代码时),线程 1 正在执行而线程 2 被阻塞(比如在条件变量上,参见 https://computing.llnl.gov/tutorials/pthreads/)。当您运行或取消暂停解释器时,线程 1 向条件变量发出信号,并等待它。这会唤醒线程 2(运行解释器)并导致线程 1 阻塞。当解释器需要暂停时,线程 2 向条件变量发出信号并等待它(因此线程 2 阻塞,线程 1 唤醒)。您可以随心所欲地在线程之间来回跳动。希望这会有所帮助。

关于c++ - Python C API - 停止执行(稍后继续执行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809321/

相关文章:

python - 智能重写 sympy 中的表达式

windows - 如何从 Windows Vista Complete PC 备份中提取文件?

c++ - 在 c/c++ 中创建时间戳的可移植方式

python - 调试 tensorflow 单元测试

c++ - 读取字符到(字符指针)

javascript - 将appear.in处理为api调用

node.js - 未找到 NodeJs Swagger Typescript Controller

c++ - 使用 clang AST 解析评论

python - Python à la Grand Central Dispatch 中的并行处理?

python - pika 中的 AsyncioConnection 和 SelectConnection 适配器有什么区别