我正在调用Python中的一个函数,我知道该函数可能会停止并迫使我重新启动脚本.

我该如何调用该函数,或者如何包装它,以便在需要5秒以上的时间时,脚本取消该函数并执行其他操作?

推荐答案

如果您在UNIX上运行,则可以使用signal软件包:

In [1]: import signal

# Register an handler for the timeout
In [2]: def handler(signum, frame):
   ...:     print("Forever is over!")
   ...:     raise Exception("end of time")
   ...: 

# This function *may* run for an indetermined time...
In [3]: def loop_forever():
   ...:     import time
   ...:     while 1:
   ...:         print("sec")
   ...:         time.sleep(1)
   ...:         
   ...:         

# Register the signal function handler
In [4]: signal.signal(signal.SIGALRM, handler)
Out[4]: 0

# Define a timeout for your function
In [5]: signal.alarm(10)
Out[5]: 0

In [6]: try:
   ...:     loop_forever()
   ...: except Exception, exc: 
   ...:     print(exc)
   ....: 
sec
sec
sec
sec
sec
sec
sec
sec
Forever is over!
end of time

# Cancel the timer if the function returned before timeout
# (ok, mine won't but yours maybe will :)
In [7]: signal.alarm(0)
Out[7]: 0

在调用signal.alarm(10)后10秒,处理程序被调用.这会引发一个异常,您可以从常规Python代码中截获该异常.

这个模块不能很好地处理线程(但是,谁能呢?)

Note that由于我们在超时发生时引发异常,它可能最终会在函数中被捕获并忽略,例如一个这样的函数:

def loop_forever():
    while 1:
        print('sec')
        try:
            time.sleep(10)
        except:
            continue

Python相关问答推荐

为什么Pydantic在我申报邮箱时说邮箱丢失

Python:根据创建时间合并两个收件箱

sys.modulesgo 哪儿了?

如何编写一个正规表达式来查找序列中具有2个或更多相同辅音的所有单词

如何使用Tkinter创建两个高度相同的框架(顶部和底部)?

使用GEKKO在简单DTE系统中进行一致初始化

如何处理嵌套的SON?

将整组数组拆分为最小值与最大值之和的子数组

如何检测背景有噪的图像中的正方形

对某些列的总数进行民意调查,但不单独列出每列

运行Python脚本时,用作命令行参数的SON文本

优化器的运行顺序影响PyTorch中的预测

driver. find_element无法通过class_name找到元素'""

如何根据一列的值有条件地 Select 前N组?

如何在表中添加重复的列?

如何在Python中获取`Genericums`超级类型?

启动带有参数的Python NTFS会导致文件路径混乱

如何使用两个关键函数来排序一个多索引框架?

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

在matplotlib中使用不同大小的标记顶部添加批注