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

时间:2011-10-18 14:55:54

标签: c++ python api profile execution

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

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

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

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

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你有一个调用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唤醒)。你可以在线程之间来回反复到你心中的内容。希望这会有所帮助。

相关问题