python - 当python使用“Python.h”调用该c++进程时,如何在python中停止一个c++进程
问题描述
在一个 c++ 程序中,我使用“Python.h”来实现一个可以在 python 中使用的 c++ 函数。在 python 中,我希望这个 c++ 函数在有限的时间内运行。所以,我在python中使用了一个函数装饰器来让c++函数在有限的时间内运行。如果函数超过给定的时间,它会引发一个 RuntimeError,然后我就让函数返回。但是我的结果好像不太好,多次调用c++函数后,程序运行越来越慢,最后crash。
这是装饰器:
def set_timeout(num, callback):
def wrap(func):
def handle(signum, frame):
raise RuntimeError()
def to_do(*args, **kwargs):
try:
signal.signal(signal.SIGALRM, handle)
signal.alarm(num)
print('start alarm signal.')
r = func(*args, **kwargs)
print('close alarm signal.')
signal.alarm(0)
return r
except RuntimeError as e:
callback()
return to_do
return wrap
def after_timeout():
return
这是带有装饰器的 python 调用的 c++ 函数:
@set_timeout(3,after_timeout)
def pytowr_run(gait,tgt,time_interval,tm,posture=None,init_dic={}):
pos,cost,varDict = pytowr.run(gait,tgt[0],tgt[1],time_interval,tm,posture,init_dic)
return pos
有没有办法让python调用的c++函数停止在python中运行?
解决方案
要停止 c++ 函数,您需要向它发送一个信号。但是仅仅发送一个信号是不够的。在 c++ 函数中,您可能需要设置一些中断点来检查是否发送了信号。例子:
#include <csignal>
#include <atomic>
constexpr int SIGALRM = 14;
std::atomic_bool signal_received;
void signal_handler(int signal) {
// check 'signal' if necessary
signal_received.store(true);
}
void config() { //call it at some start point...
signal_received.store(false);
std::signal(SIGALRM, signal_handler);
}
void your_function(/*args*/) {
/* do some work */
if (signal_received.load()) return; //interrupt point. Exiting your c++ function...
// the interrupt point must be placed in a strategic place
/* maybe more work */
}
推荐阅读
- bash - 在 bash 中比较文件中的行
- python - 箱线图:提取异常值并将它们标记为“0”或“1”
- python-requests - 具有多个参数的机器人框架“multipart/form-data”REST 请求
- sql - 如何使用表中的多个计数
- git - lint-staged:“git add”命令的目的是什么
- jenkins - Jenkins 基于角色/组的 UI 以隔离构建作业
- c++ - 获取输入后如何将int转换为char,char转换为int
- java - Mobile First 7.1 FWLSE0376E:JWS 签名的 ClientId 签名与客户端 ID 不匹配
- c# - 检查对象列表是否包含其属性具有特定值的对象
- git - PR 显示“没有更改”,即使已推送更改