当前位置: 首页 > 面试题库 >

Python-函数调用超时

长孙深
2023-03-14
问题内容

我正在Python中调用一个函数,该函数可能会停滞并迫使我重新启动脚本。

如何调用该函数或将其包装在其中,以便如果花费的时间超过5秒,脚本将取消该函数并执行其他操作?


问题答案:

如果在UNIX上运行,则可以使用信号包:

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

调用后10秒钟,将调用alarm.alarm(10)处理程序。这引发了一个异常,你可以从常规Python代码中拦截该异常。

该模块不能很好地与线程配合使用(但是,谁可以呢?)

请注意,由于发生超时时会引发异常,因此该异常可能最终在函数内部被捕获并被忽略,例如一个这样的函数:

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


 类似资料:
  • 问题内容: 在所有其他与super构造函数一起使用的语言中,都是隐式调用的。如何在Python中调用它?我希望这是行不通的。 问题答案: super()在新样式类中返回类似父对象的对象:

  • 问题内容: 为什么下面的代码不打印任何内容: 我正在Python 3中执行上述代码。我想我缺少了一些非常基本的东西,但无法弄清楚。 问题答案: 返回iterator,直到您要求它之前,它不会处理元素。 将其变成列表以强制处理所有元素: 或将其长度设置为0以不产生列表(如果不需要地图输出): 但是请注意,对于任何以后的代码维护者而言,简单地使用循环都更具可读性:

  • 在部署到vercel后,我的一个页面上出现了这个错误,在开发模式下一切正常。 我认为问题可能是我的fetch/API之一,因为它使用第一个fetch请求中的数据作为第二个fetch请求的URL。。。 我的所有其他页面都有不同的API/获取请求,可以正常工作。。。

  • 问题内容: 我试图从我的JavaScript代码中调用Python中的函数。我使用了此处说明的代码,但对我不起作用。 这是我的JS代码: Python代码: 你知道这是怎么回事吗? 问题答案: 除了上述要点之外,并假设您已经具有适当的设置来服务您的python脚本并返回响应。您应该提交一个异步请求,尤其是在python代码进行大量计算的情况下。 如果您只进行少量计算,而使用从jQuery 1.8开

  • 问题内容: 我正在尝试从C ++实现调用Python函数。我以为可以通过函数指针来实现,但是似乎不可能。我一直在使用以完成此任务。 假设在Python中定义了一个函数: 现在,我需要将此函数传递给C ,以便可以从那里调用它。如何在C 端编写代码以实现此目的? 问题答案: 如果可以使用任何名称: 将其传递给需要一个的函数。 如果它在具有相同名称的单个已知名称空间中: 已定义,因此您可以像调用任何函数

  • 问题内容: 我想使用Python的某些Haskell库(例如Darcs,Pandoc),但似乎在Python中没有直接的Haskell外部函数接口。有什么办法吗? 问题答案: 只要您可以获取Python代码来调用C,就可以调用已通过FFI导出的Haskell函数 另一种方法是编写标准IPC接口,在darcs和pandoc的情况下,仅将它们称为原始可执行文件,然后解析其输出可能是可行的方法。 至于在