Python C API -停止执行(稍后继续执行)
Python C API - Stopping Execution (and continuing it later)
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唤醒)。你可以在这些线索之间来回跳来跳去,随心所欲。
- C++ 在信号处理程序后继续执行
- 超时后,线程睡眠不会继续执行
- 在构造函数中删除后继续执行
- 由于找不到cpprest_2_10.dll,代码执行无法继续
- c++:if 语句无法正常运行,并继续执行无效输出
- 英特尔 Pin:RECEIVED_ACCESS_FAULT异常后正确继续执行
- 如果发生错误,则返回错误值,否则,继续执行函数
- 睡眠线程或进程的指令是否在线程/进程休眠时继续执行?
- 使用 UWP 中的 IAsyncOperation 继续执行任务
- C++可执行文件继续寻找序号入口点
- 是什么导致程序在我继续执行另一个功能之前停止
- 使用 ASSERT_DEATH 时,有没有办法在应用程序终止后自动继续执行所有测试
- 现代C++.从继续执行的工作线程返回数据结构
- 在击中断点并继续执行VS时,如何在运行时自动修改变量的值
- 在调用GNUPLOT之后,如何继续执行C 代码
- OpenMP 构造,在至少 1 个线程完成后立即继续执行
- 如果我已经完成了当前功能,我该如何选择继续执行另一个功能
- 循环浏览文件夹中的所有文件以继续执行脚本
- 希望定期执行一个函数,但继续程序循环的其余部分
- 在 GDB 中调试多线程服务器 - 查找每个线程的状态.执行时继续并停止