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

功能超时(Windows)?

戚阳
2023-03-14
问题内容

我正在尝试为特定功能实现超时。我检查了SE中的许多问题,找不到适合我问题的解决方案,因为:

  1. 我在Windows中运行python
  2. 超时是在我无法控制的python函数上应用的,即它是在已经设计好的模块中定义的。
  3. python函数不是子进程

我已经MyModule为特定任务开发了一个已经设计好的定制模块(例如),并且其中定义了功能。其中一个功能(例如MyFunc)由于外部因素而倾向于永久运行,而我只是不希望python脚本挂起。

我打算添加一个超时功能,如下面的伪代码所示:

import MyModule

set_timeout(T)
MyResult=MyModule.MyFunc()

#Come to this part of script after execution of MyFunc() or after T seconds (the latter on priority)
if Timeout occurred:
    print 'MyFunc did not execute completely'
else:
    print 'MyFunc completed'

但是我不确定哪个模块可以在html" target="_blank">python上实现。请注意,我是新手,并且我编写的所有脚本都直接基于SE Answers或Python文档。


问题答案:

我认为解决此问题的一种好方法是创建一个装饰器并使用该Thread.join(timeout=seconds)方法。请记住,没有杀死线程的好方法,因此只要您的程序正在运行,它就会或多或少在后台继续运行。

首先,创建一个这样的装饰器:

from threading import Thread
import functools

def timeout(timeout):
    def deco(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            res = [Exception('function [%s] timeout [%s seconds] exceeded!' % (func.__name__, timeout))]
            def newFunc():
                try:
                    res[0] = func(*args, **kwargs)
                except Exception as e:
                    res[0] = e
            t = Thread(target=newFunc)
            t.daemon = True
            try:
                t.start()
                t.join(timeout)
            except Exception as je:
                print ('error starting thread')
                raise je
            ret = res[0]
            if isinstance(ret, BaseException):
                raise ret
            return ret
        return wrapper
    return deco

然后,执行以下操作:

func = timeout(timeout=16)(MyModule.MyFunc)
try:
    func()
except:
    pass #handle errors here

您可以在需要的任何地方使用此装饰器,例如:

@timeout(60)
def f():
    ...


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

  • 问题内容: 我正在尝试在angularJS中实现一个简单的计时器。但是,尽管每个人都建议超时功能不起作用。 当我注释掉“ $ timeout(countUp,500);”时 行,代码可以正常工作,但计时器不起作用。我还需要添加其他JavaScript文件吗? 提前致谢。 问题答案: 您必须将服务注入控制器

  • 问题内容: 我正在使用Android上的Firebase Cloud Functions库,并用于调用云函数。 问题在于该函数需要10到15秒的时间才能将结果返回给客户端,因此客户端会抛出异常。 码 如何更改超时,以便客户端在引发异常之前会等待更多时间? 注意。 我没有使用OkHttp,Retrofit或默认的系统网络功能,而是在使用Firebase Cloud Functions库()来调用该函

  • 我在Android上使用Firebase Cloud Functions library,并使用调用云函数。 问题是函数需要10-15秒将结果返回给客户端,因此客户端抛出异常。 注意。我没有使用OkHttp、REVERFIT或默认的系统网络函数,而是使用Firebase Cloud functions library()调用该函数。

  • 问题内容: 我正在尝试使用current.futures模块使超时在python3.2中工作。但是,当它超时时,并不会真正停止执行。我尝试了使用线程和进程池执行器,但它们都没有停止任务,只有直到完成后,超时才会增加。那么,有谁知道是否有可能使它起作用? 问题答案: 据我所知,TimeoutError实际上是在您期望的时间引发的,而不是在任务完成之后引发的。 但是,您的程序本身将继续运行,直到完成所

  • 问题内容: 我有一个小的jquery片段,该页面在屏幕顶部显示通知消息,以响应页面上的用户操作。该通知通常在Ajax操作之后显示,其中包含动态内容。 例如: 该通知运行良好,除非用户连续快速执行两个或多个操作,否则超时功能将使自己感到困惑,并且第二条消息似乎在之前的3000毫秒之内。 如果执行新操作,是否有办法“杀死”先前的通知。我对动作/选择器没有问题,只是TimeOut函数....要么停止它,