跳转到主要内容

Python模块,允许您在调用任何现有函数时指定超时。还提供对可停止线程的支持。

项目描述

func_timeout

Python模块,支持以指定超时运行任何现有函数。

函数超时

func_timeout

这是您传递超时、要调用的函数以及任何参数的函数。它最多运行#timeout#秒,并返回/引发传递的函数会返回或引发的任何内容。

def func_timeout(timeout, func, args=(), kwargs=None)

‘’’

func_timeout - 运行指定的函数,最多#timeout#秒。

引发#func#会引发的任何异常,返回#func#会返回的内容(除非超时,在这种情况下会引发FunctionTimedOut异常)

@param timeout <float> - 在终止#func#之前运行#func#的最大秒数

@param func <function> - 要调用的函数

@param args <tuple> - 传递给函数的任何有序参数

@param kwargs <dict/None> - 传递给函数的关键字参数。

@raises - 如果超时,则引发FunctionTimedOut异常,否则#func#会引发的任何异常都将被引发

@return - #func# 函数的返回值

‘’’

示例

例如,如果你有一个名为“doit(‘arg1’,‘arg2’)”的函数,你希望将其运行时间限制为5秒,使用func_timeout可以像这样调用它

from func_timeout import func_timeout, FunctionTimedOut

try

doitReturnValue = func_timeout(5, doit, args=('arg1', 'arg2'))

except FunctionTimedOut

print("doit(‘arg1’,‘arg2’) 在5秒内未能完成并已被终止。\n")

except Exception as e

## 在这里处理doit可能抛出的任何异常

func_set_timeout

这是一个装饰器,你可以用它来应用func_timeout。

它接受两个参数,“timeout”和“allowOverride”

如果存在“allowOverride”,将在包装函数中添加一个可选关键字参数“forceTimeout”。如果提供,它将覆盖此函数上使用的超时。

“timeout”参数可以是数字(用于固定超时),或函数/lambda。如果使用函数/lambda,它将传递与调用函数相同的参数。它应该返回一个数字,该数字将用作该特定运行的超时。例如,如果你有一个计算数据的方法,对于100万条记录,你可能希望有更高的超时值,而不是50条记录。

示例

@func_set_timeout(2.5)

def myFunction(self, arg1, arg2)

FunctionTimedOut

如果函数超时,将抛出此异常。

它有一个“retry”方法,该方法接受以下参数

## 无参数 - 使用相同的参数、相同的函数和相同的时间重试

## 数字参数 - 使用相同的参数、相同的函数、提供的时间重试

## 无参数 - 使用相同的参数、相同的函数、不设置超时

工作原理

func_timeout会在指定的线程中使用指定的参数运行指定的函数,直到它返回、抛出异常或超时。

如果有返回或抛出异常,它将按正常方式返回/抛出。

如果超时已超过,将在被调用函数的上下文中以及从“func_timeout”的上下文中抛出“FunctionTimedOut”异常。你应该让函数捕获“FunctionTimedOut”异常,并在可能的情况下干净地退出。在函数终止前的每2秒,它都会继续抛出FunctionTimedOut。超时函数的终止是在线程的上下文中发生的,不会阻塞主执行。

StoppableThread

StoppableThread是threading.Thread的子类,支持停止线程(支持python2和python3)。它甚至可以在C代码中工作以停止线程。

其工作原理是,你传递一个异常,并通过cpython api引发它(所以下一次从C api调用“python”函数,或者在python代码中处理下一行时,将引发异常)。

使用StoppableThread

你可以使用StoppableThread的两种方式之一

作为父类

你的线程可以扩展func_timeout.StoppableThread.StoppableThread并实现“run”方法,就像正常的线程一样。

from func_timeout.StoppableThread import StoppableThread

class MyThread(StoppableThread)

def run(self)

## 这里写代码

return

然后,你可以创建并启动这个线程,如下所示

myThread = MyThread()

## 取消注释下一行以在“daemon mode”下启动线程 -- 即在主线程退出时自动终止/加入

##myThread.daemon = True

myThread.start()

然后,在任何时间点,你都可以调用.stop(StopExceptionType)来停止它(更多请参阅“停止线程”以下内容)

直接执行函数的线程

或者,你可以直接实例化StoppableThread并传递“target”、“args”和“kwargs”参数到构造函数

myThread = StoppableThread(target=myFunction, args=('ordered', 'args', 'here'), kwargs={'keyword args': 'here'})

## 取消注释下一行以在“daemon mode”下启动线程 -- 即在主线程退出时自动终止/加入

##myThread.daemon = True

myThread.start()

这允许您在可停止的线程中调用函数,例如事件循环中的处理程序,这些函数可以在以后通过.stop()方法停止。

停止线程

StoppableThread类(您必须扩展此类以使用线程)添加了一个stop函数,可以调用它来停止线程。

def stop(self, exception, raiseEvery=2.0)

‘’’

通过抛出指定的异常来停止线程。

@param exception <异常类型> - 要抛出的异常。您可能想使用从BaseException继承的某种东西

(因此except Exception as e: continue; 不会成问题)

这应该是一个类/类型,而不是一个实例,即MyExceptionType而不是MyExceptionType()

@param raiseEvery <浮点数> 默认 2.0 - 我们将在每#raiseEvery秒重复抛出此异常

直到线程终止。

如果您的代码捕获了特定的异常类型,这将在您每#raiseEvery秒清理退出之前允许您这样做。

如果您正在调用无法控制的第三方代码,它捕获了BaseException,将此值设置为低数字

以跳出其异常处理程序。

@return <None>

‘’’

“exception”参数必须是一个类型,并且它必须可以无参数实例化(即MyExceptionType()必须创建对象)。

考虑使用扩展BaseException的自定义异常类型,然后您可以使用它进行基本的清理(刷新任何打开的文件等)。

您传递的异常类型将在可停止线程的上下文中每#raiseEvery秒被抛出。您可以调整此值以给自己更多的时间进行清理,或者您可以将其缩小以跳出空的异常处理程序(裸except/try/except)。

有关异常类型的说明

建议您创建一个扩展BaseException的异常,而不是Exception,否则类似这样的代码将永远不会停止

while True

try

doSomething()

except Exception as e

continue

如果无法避免此类代码(第三方库?),可以将“repeatEvery”设置为非常非常低的数字(如.00001),这样它可能会触发,进入except子句,然后再次触发,在“continue”之前。

您可能希望考虑使用具有固定错误消息的单例类型,以便跟踪等记录超时调用。

例如

class ServerShutdownExceptionType(BaseException)

def __init__(self, *args, **kwargs)

BaseException.__init__(self, ‘Server is shutting down’)

这将强制“Server is shutting down”成为此异常保留的消息。

Pydoc

http://htmlpreview.github.io/?https://github.com/kata198/func_timeout/blob/master/doc/func_timeout.html?vers=4.3.5 查找最新的pydoc。

支持

我已经在python 2.7、3.4、3.5、3.6、3.7上测试了func_timeout。它应该在其他版本上也能工作。

在windows、linux/unix、cygwin、mac上工作

更改日志可在https://raw.githubusercontent.com/kata198/func_timeout/master/ChangeLog找到

Pydoc可在: http://htmlpreview.github.io/?https://github.com/kata198/func_timeout/blob/master/doc/func_timeout.html?vers=1 查找

项目详细信息


下载文件

下载适合您平台的自定义文件。如果您不确定要选择哪个,请了解有关安装软件包的更多信息。

源分布

func_timeout-4.3.5.tar.gz (44.3 kB 查看哈希值)

上传时间: 源代码

支持