我想循环遍历一组文件,并对每个文件执行“ runthingy()”中指定的操作。但是,由于此操作卡在了停止整个程序的某些文件上,如果要花费超过120秒的时间才能完成,我想跳过此特定文件。我正在使用Windows,这就是signal.SIGALARM不可用的原因,所以我改用了stopit库(https://pypi.org/project/stopit/)。以下示例代码将终止while循环并在3秒后显示超时:
with stopit.ThreadingTimeout(3) as to_ctx_mrg:
while(True):
continue
if to_ctx_mrg.state == to_ctx_mrg.TIMED_OUT:
print("Time out")
但是,如果runthingy()函数被卡住/需要花费很多时间才能在此上下文中使用它,则永远不会超时:
for filename in os.listdir(os.getcwd()+"\\files\\"):
with stopit.ThreadingTimeout(120) as to_ctx_mrg:
runthingy(filename)
if to_ctx_mrg.state == to_ctx_mrg.TIMED_OUT:
print("Time out")
continue
答案 0 :(得分:1)
我没有使用过的库的经验,但是它说它在超时线程中引发了一个异步异常。
问题是为什么您的函数被“卡住”? Python解释器仅在解释该线程中的Python指令时才会检测到已引发异常。如果您的函数卡住的原因是它进行了一次C调用,但未返回,则其他Python线程可能仍可以运行,但它们将无法中断远程线程。
您需要更仔细地研究为什么'runthingy()'被阻止。是从套接字读取还是在等待文件锁?如果阻塞的调用具有可选的超时,则请确保将timeout参数设置得相当低:即使代码只是在超时后重试该调用,它也至少为Python解释器提供了进入那里并中止进程的机会。 / p>
更好的是,如果您能找出该函数为何会失败的原因,则可以解决根本的问题,而无需施加暴力超时。