在 Windows 上设置超时限制

Lud*_*igH 4 python windows timeout python-3.x

我有一个函数,运行时间不会太长。我想为其设置一个超时限制。我可以在互联网上找到一种建议的解决方案。请参阅以下 SO 帖子。函数调用超时

该解决方案使用信号,这在 Windows 上不可用。信号也有类似的用途来制作自动收报机,它有一个 Windows 端口,如这篇 SO 帖子中所解释的:python:windows 相当于 SIGALRM这不是直接超时的答案,但可以适应超时。它是为 python 2.7 编写的。

由于答案大约有 10 年历史,我的问题是:是否有更现代的 python(例如 python 3.7)方法来创建上下文管理器/装饰器/类似包装器,将“普通函数”制作为超时限制函数视窗系统?

mar*_*eau 5

这是一种将 @Praveenkumar 的答案转换为易于使用的装饰器的方法,您现在似乎想知道:

import time
import concurrent.futures as futures


def timeout(timelimit):
    def decorator(func):
        def decorated(*args, **kwargs):
            with futures.ThreadPoolExecutor(max_workers=1) as executor:
                future = executor.submit(func, *args, **kwargs)
                try:
                    result = future.result(timelimit)
                except futures.TimeoutError:
                    print('Timedout!')
                    raise TimeoutError from None
                else:
                    print(result)
                executor._threads.clear()
                futures.thread._threads_queues.clear()
                return result
        return decorated
    return decorator


@timeout(3)
def test(n):
    print(f'Sleeping for {n} seconds')
    time.sleep(n)
    # Real code here.
    return 'Done'

test(2)  # OK
test(5)  # -> Causes timeout.
Run Code Online (Sandbox Code Playgroud)