Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止c++;进程,当python调用该c++;流程使用";Python.h"; 在C++程序中,我使用了Python .h来实现一个可以在Python中使用的C++函数。 在Python中,我希望这个C++函数在有限的时间内运行。 所以,我在Python中使用了函数装饰器,让C++函数在有限的时间内运行。如果函数超过给定的时间,它将引发RuntimeError,然后我就让函数返回。 但是我的结果似乎不好,在C++函数被调用多次之后,程序运行得越来越慢,最后崩溃。_Python_C++ - Fatal编程技术网

如何阻止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++进程”。作为这里的新用户,请同时阅读。