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

3 投票
1 回答
769 浏览
提问于 2025-04-17 04:33

1) 我想用Python的C接口中的性能分析功能,来捕捉Python解释器在特定函数返回时的状态。

2) 我希望能暂停Python解释器,然后把执行权返回给在我的C++程序中调用解释器的那个函数,最后再把执行权交回给Python解释器,从暂停的地方继续执行,也就是在它停止的那行代码之后。我想在Python执行期间,保持全局变量和局部变量的状态。

第一部分我已经完成了。第二部分是我的问题。我不知道该保存什么数据,以便能够恢复执行,或者如何根据保存的数据恢复执行。

根据我从Python API文档中了解到的,我需要保存执行框架的一部分,但我还没有找到相关的信息。有一些额外的问题……PyFrameObject到底包含什么?令人惊讶的是,Python API文档中从来没有解释过这一点。

1 个回答

2

如果我理解你的问题,你有一个C++程序,它会调用Python。当Python执行完一个函数后,你想暂停Python解释器,然后继续执行C++代码。过了一段时间后,你的C++程序需要再次调用Python,并让Python解释器从它暂停的地方继续。

我觉得用一个线程来实现这个并不容易。在你暂停解释器之前,调用栈的状态是这样的:

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

要暂停解释器,你需要保存解释器的状态,然后跳回到最上面的C++调用栈。然后要恢复时,你需要把保存的状态还原,并跳回到你之前停止的地方。跳转这个操作是可以做到的(可以参考http://en.wikipedia.org/wiki/Setjmp.h),但保存和恢复调用栈就比较复杂了。我不知道有没有现成的接口可以做到这一点。

不过,你可以用两个线程来实现这个功能。在你的C++程序开始时创建的线程(我们称它为线程1)运行C++代码,然后它再创建一个线程2来运行Python解释器。

最开始(当在运行C++代码时),线程1在执行,而线程2则处于阻塞状态(比如在一个条件变量上,具体可以参考https://computing.llnl.gov/tutorials/pthreads/)。当你运行或恢复解释器时,线程1会发出信号给条件变量,然后在这个条件变量上等待。这会唤醒线程2(也就是运行解释器的线程),同时让线程1进入阻塞状态。当解释器需要暂停时,线程2会发出信号给条件变量并等待(这样线程2就阻塞了,而线程1则被唤醒)。你可以在这两个线程之间来回切换,随心所欲。希望这对你有帮助。

撰写回答