![]() |
1
281
你可以使用 signal 如果您在UNIX上运行,请执行以下操作:
通话后10秒
注意 由于我们在超时发生时引发异常,因此可能会在函数内部捕获并忽略异常,例如,一个这样的函数:
|
![]() |
2
192
你可以用
密码
|
![]() |
3
94
我贴了一张
gist
这就解决了这个问题,一个装饰师和一个
导入和设置以实现兼容性它是用Python2和Python3测试的。它也应该在Unix/Linux和Windows下工作。
现在我们已经从标准库导入了我们的功能。
|
![]() |
4
60
我有一个不同的建议,它是一个纯函数(使用与线程建议相同的API),并且似乎工作良好(基于此线程的建议)
|
![]() |
5
36
那么,让测试或任何您喜欢的功能超时就这么简单:
|
![]() |
6
31
这个
我喜欢这个
在pypi上查看它: https://pypi.python.org/pypi/stopit |
![]() |
7
19
有很多建议,但是没有一个使用concurrent.futures,我认为这是处理这个问题最清晰的方法。
python 3.2+的本机版本,后端口为2.7(pip安装)。
在线程和进程之间切换就像替换
如果您想在超时时终止进程,我建议您 Pebble . |
![]() |
8
17
非常好,易于使用和可靠 皮皮 项目 ( https://pypi.org/project/timeout-decorator/ 安装 :
:
|
![]() |
9
15
我是wrapt_timeout_decorator的作者 乍一看,这里介绍的大多数解决方案在Linux下都能正常工作——因为我们有fork()和signals()——但在windows上看起来有些不同。 当涉及到Linux上的子线程时,您不能再使用信号。 为了在Windows下生成进程,它需要是可拾取的,而许多修饰函数或类方法则不是。 因此,您需要使用更好的pickler,比如dill和multiprocess(而不是pickle和multiprocessing)——这就是为什么您不能使用ProcessPoolExecutor(或者只能使用有限的功能)。 函数是否应该在0.5+0.2秒后超时(因此让该方法运行0.2秒)? 此外,嵌套的装饰程序可能很讨厌,并且不能在子线程中使用信号。如果您想创建一个真正通用的、跨平台的装饰器,所有这些都需要考虑(并进行测试)。
@Alexis Eggermont-不幸的是,我没有足够的观点发表评论-也许其他人可以通知你-我想我解决了你的进口问题。 |
![]() |
10
14
在@piro的基础上并通过@piro增强答案,您可以构建一个contextmanager。这允许非常可读的代码在成功运行后禁用alaram信号(设置signal.alarm(0))
用法示例:
|
![]() |
11
8
如果在windows系统中使用超时装饰器,您将获得以下结果
Author@bitranox创建了以下包:
代码示例:
|
![]() |
12
5
有关平行贴图的完整解释和扩展,请参见此处 https://flipdazed.github.io/blog/quant%20dev/parallel-functions-with-timeouts 最小示例
果然
笔记
由于这种方式,您需要在函数内部导入
|
![]() |
13
4
我们可以用信号来做同样的事情。我认为下面的例子对你很有用。与线程相比,它非常简单。
|
![]() |
14
3
另一个使用asyncio的解决方案: 如果您想取消后台任务,而不仅仅是在运行的主代码上超时,那么您需要来自主线程的显式通信来请求取消任务的代码,比如threading.Event()
|
![]() |
15
2
|
![]() |
16
2
以防万一,基于@piro的答案,我制作了一个函数装饰器:
在具有
|
![]() |
17
1
嵌套的 定时中断(SIGALARM无法做到)不会被time.sleep阻止(基于线程的方法无法做到)。我最终从这里复制并轻微修改了代码: http://code.activestate.com/recipes/577600-queue-for-managing-multiple-sigalrm-alarms-concurr/
以及一个使用示例:
|
![]() |
18
1
|
![]() |
19
0
这里是对给定的基于线程的解决方案的一个轻微改进。 例外情况 :
|
![]() |
20
0
以下是POSIX版本,它结合了前面的许多答案,提供了以下功能:
以下是代码和一些测试用例:
|
![]() |
Iorek · Python线程打印覆盖自身[重复] 6 年前 |
![]() |
abdelrahman · 具有PyQt5多线程的Python GUI 6 年前 |
![]() |
Oliver Frost · 使用线程在后台持续运行的函数? 7 年前 |
![]() |
Elinoter99 · Python调用脚本而不等待其执行 7 年前 |
|
JohannB · Python线程连接死线程 7 年前 |
![]() |
Bastian · 如何在上下文管理器中使用线程? 7 年前 |
![]() |
anoneemus · Python套接字窃取彼此的数据包 7 年前 |
![]() |
Shawn H. · 使多线程执行单个命令 7 年前 |