Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
用Python处理ctypes函数中的无限循环_Python_Loops_Timeout_Ctypes_Infinite - Fatal编程技术网

用Python处理ctypes函数中的无限循环

用Python处理ctypes函数中的无限循环,python,loops,timeout,ctypes,infinite,Python,Loops,Timeout,Ctypes,Infinite,假设我在C中定义了几个函数,其中一个函数导致无限循环。我使用Python中的ctypes模块来运行这些函数中的每一个,因此它会导致一个无限循环,导致Python脚本完全停止 我试图在超时情况下运行C函数,但超时从未被触发。我该怎么处理?我无法停止我的Python脚本,如果遇到这个无限循环函数,我的要求是打印一条错误消息,然后继续执行下一个函数。超时情况如下所示: limit = 10 def raise_timeout(signum, frame): raise TimeoutError

假设我在C中定义了几个函数,其中一个函数导致无限循环。我使用Python中的ctypes模块来运行这些函数中的每一个,因此它会导致一个无限循环,导致Python脚本完全停止

我试图在超时情况下运行C函数,但超时从未被触发。我该怎么处理?我无法停止我的Python脚本,如果遇到这个无限循环函数,我的要求是打印一条错误消息,然后继续执行下一个函数。超时情况如下所示:

limit = 10
def raise_timeout(signum, frame):
    raise TimeoutError

def timeout(limit):
    signal.signal(signal.SIGALARM, raise_timeout)
    signal.alarm(limit)
    try:
        yield
    except TimeoutError:
        print('Timed out')
    finally:
        signal.signal(signal.SIGALARM, signal.SIG_IGN)


## Attempting to run function

for function in function_list:

    #Perform actions to load the shared .so library, define res/argtypes etc

    with timeout(limit):
        result = c_lib() # This is the function I run from ctypes

我看到的唯一方法是使用计时器处理它,例如,10秒左右。但是我觉得我做错了——我的Python脚本有没有办法发现ctypes函数已经10秒没有响应了,因此它应该以某种方式退出

我在这里很绝望,任何一种能起作用但违背常识的黑客行为也可以(


非常感谢您的帮助。

如果C代码挂起,据我所知Python无法重新获得控制权。您可以尝试使用多处理池调用该函数

演示:

输出:

result=1
result=2
Terminated.
Terminated.

很抱歉,错误在C中。Python无法恢复控制。您可以从多处理模块调用该函数,然后在该函数挂起时终止该进程。您好,这意味着即使我从超时函数中调用该函数,它仍然无法检测到该函数已运行超过10秒?编辑:多进程看起来很有前途,你能给我指出一个资源吗?有没有办法检测进程是否处于无限循环中?这对我来说非常有效,谢谢!你知道这样是否也可以捕获C函数中发生的segfault?segfault会终止池进程,还是会终止池进程整个python脚本,就像它现在做的那样?
result=1
result=2
Terminated.
Terminated.