【问题标题】:Python C API - Stopping Execution (and continuing it later)Python C API - 停止执行(稍后继续)
【发布时间】:2011-12-10 04:39:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你试过用SIGSTOP/SIGCONT看吗?
  • 我的 Python 解释器与我的 C++ 程序在同一个线程中运行...我希望在该线程中传递执行,而不是停止整个过程...也许我不完全理解SIGSTOP 和 SIGCONT 会对我的程序产生什么影响?如果有,请解释。

标签: c++ python api profile execution


【解决方案1】:

如果我理解你的问题,你有一个调用 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 唤醒)。您可以随心所欲地在线程之间来回跳动。希望这会有所帮助。

【讨论】:

  • 谢谢!我刚刚在你的答案中搜索了我不明白的词汇,所以现在我明白你的意思了。像魅力一样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2021-01-21
相关资源
最近更新 更多