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

Python-超时功能,如果完成时间太长

单于皓轩
2023-03-14
问题内容

我有一个Shell脚本,该脚本遍历包含要访问的URL:s并截取其屏幕截图的文本文件

所有这一切都完成且简单。该脚本会初始化一个类,该类在运行时会创建列表中每个站点的屏幕快照。某些站点的加载时间非常非常长,而某些站点可能根本无法加载。因此,我想将screengrabber函数包装在一个超时脚本中,以使该函数False在10秒内无法完成时返回。

我对最简单的解决方案感到满意,也许设置一个异步计时器,无论函数内部实际发生什么,该计时器都会在10秒后返回False


问题答案:

signal的文档中描述了用于使操作超时的过程。

基本思想是使用信号处理程序在某个时间间隔内设置警报,并在计时器到期后引发异常。

请注意,这仅适用于UNIX。

这是一个创建装饰器的实现(将以下代码另存为timeout.py)。

from functools import wraps
import errno
import os
import signal

class TimeoutError(Exception):
    pass

def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise TimeoutError(error_message)

        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result

        return wraps(func)(wrapper)

    return decorator

这将创建一个称为的装饰器@timeout,该装饰器可应用于任何长时间运行的函数。

因此,在你的应用程序代码中,你可以像这样使用装饰器:

from timeout import timeout

# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1():
    ...

# Timeout after 5 seconds
@timeout(5)
def long_running_function2():
    ...

# Timeout after 30 seconds, with the error "Connection timed out"
@timeout(30, os.strerror(errno.ETIMEDOUT))
def long_running_function3():
    ...


 类似资料:
  • 问题内容: 一定时间后如何使承诺超时?我知道Q有一个Promise超时,但是我使用的是本机NodeJS Promise,它们没有.timeout函数。 我是否想念一个或包裹不同的包裹? 或者,下面的实现在不占用内存的情况下是否很好,实际上按预期方式工作? 还可以以某种方式将其包装到全局中,以便将其用于我创建的每个promise,而不必重复setTimeout和clearTimeout代码吗? 谢谢

  • 问题内容: 我想编写一个代码,要求输入用户名,但时间限制为15秒。如果用户超过限制并且未能输入名称(或任何字符串),则代码将终止,并且将显示“超时”消息,否则应保存名称并显示“谢谢”消息。我曾经尝试过这种方法,但是这是错误的&无法正常工作。请给我一个解决方案。。谢谢。 问题答案: 该虚拟程序可能会帮助您: 更新: 这是经过测试的代码。 另外,我从man那里得到了一些提示。本手册已包含一个代码段,该

  • 问题内容: 我正在将magento从1.4.0.1升级到1.7.0.2。最初有一些错误;修复这些问题后,现在升级将运行5个小时,并且从未完成。没有错误显示。知道为什么会这样吗? 问题答案: 我在查询日志中通过更改 lib \ Varien \ Db \ Adapter \ Pdo \ Mysql.php 文件中的以下行 然后通过分析 pdo_myql.log 文件,我知道一个查询正在执行错误,因此

  • 问题内容: 我正在尝试为特定功能实现超时。我检查了SE中的许多问题,找不到适合我问题的解决方案,因为: 我在Windows中运行python 超时是在我无法控制的python函数上应用的,即它是在已经设计好的模块中定义的。 python函数不是子进程 我已经为特定任务开发了一个已经设计好的定制模块(例如),并且其中定义了功能。其中一个功能(例如)由于外部因素而倾向于永久运行,而我只是不希望pyth

  • 本文向大家介绍android利用service完成计时功能,包括了android利用service完成计时功能的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了android service计时功能的具体代码,供大家参考,具体内容如下 源码下载地址:https://github.com/luoye123/Timing 1、首先建立主页面的设计:activity_time.xml 2、Act

  • 我试图提取顶级URL并忽略路径。我使用的代码如下: 这个脚本已经运行了一个小时了。当我运行它时,它给出了以下警告: 如果有人能给我一个更快的建议,我将不胜感激,也许是“警告”建议的方法