如何阻止c++;进程,当python调用该c++;流程使用";Python.h"; 在C++程序中,我使用了Python .h来实现一个可以在Python中使用的C++函数。 在Python中,我希望这个C++函数在有限的时间内运行。 所以,我在Python中使用了函数装饰器,让C++函数在有限的时间内运行。如果函数超过给定的时间,它将引发RuntimeError,然后我就让函数返回。 但是我的结果似乎不好,在C++函数被调用多次之后,程序运行得越来越慢,最后崩溃。
这是装饰师:如何阻止c++;进程,当python调用该c++;流程使用";Python.h"; 在C++程序中,我使用了Python .h来实现一个可以在Python中使用的C++函数。 在Python中,我希望这个C++函数在有限的时间内运行。 所以,我在Python中使用了函数装饰器,让C++函数在有限的时间内运行。如果函数超过给定的时间,它将引发RuntimeError,然后我就让函数返回。 但是我的结果似乎不好,在C++函数被调用多次之后,程序运行得越来越慢,最后崩溃。,python,c++,Python,C++,这是装饰师: 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)
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
@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++函数,带有装饰器:
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
@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中停止运行?
< P>停止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 */
}
#包括
#包括
constexpr int SIGALRM=14;
std::接收到原子波信号;
无效信号处理器(int信号){
//如有必要,检查“信号”
接收到信号。存储(真);
}
void config(){//在某个起点调用它。。。
接收到信号。存储(错误);
std::信号(信号处理器,信号处理器);
}
使_函数无效(/*args*/){
/*做些工作*/
如果(SigalAlx.Load,Load())返回;//中断点。退出C++函数…
//中断点必须置于战略位置
/*也许还有更多的工作*/
}
如果我理解您的目标,我认为更好的解决方案是调用C/C++函数并将分配的时间传递到C/C++函数中,而不是尝试从python中删除该函数,这是可行的,但会使代码更难阅读和调试
#include datetime.h
PyDateTime_IMPORT
bool your_function(passed_in_vars, start_time * PyDateTime_DateTime allotted_time* int )
{
kill_time = PyDateTime_DATE_GET_MICROSECOND(PyDateTime_DateTime *o) + allotted
/* do some work */
if ( allotted_time > kill_time )
return; //interrupt point. Exiting your c++ function...
//do more work...
}
<>这使得代码在Python端更容易没有循环或等待状态,并且在C++方面更容易知道何时杀死函数并释放任何清理代码。
在C++侧发现瓶子瓶颈更容易。p> 如果要停止进程,则创建该进程中运行的程序所用的编程语言无关紧要。从这个意义上讲,没有所谓的“C++进程”。作为这里的新用户,请同时阅读。