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

Python C API - Stopping Execution (and continuing it later)

本文关键字:执行 继续 API Python      更新时间:2023-10-16

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

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

第一部分我已经完成了。第二部分是我的问题。我不知道保存什么,这样我就可以返回执行,或者如何返回执行给定保存的数据。

从我能得到的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唤醒)。你可以在这些线索之间来回跳来跳去,随心所欲。