热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python中concurrent.futures超时机制的有效性探讨

本文探讨了Python中使用concurrent.futures模块实现进程超时的有效性,并提供了一种更可靠的解决方案。

尝试通过简单的方法实现基于进程的同步超时,代码示例如下:

from concurrent.futures import ProcessPoolExecutor
import time
def call_with_timeout(func, *args, timeout=3):
with ProcessPoolExecutor(max_workers=1) as pool:
future = pool.submit(func, *args)
try:
result = future.result(timeout=timeout)
return result
except TimeoutError:
print("任务超时")

理论上,传递给future.result()的超时参数应该能够限制任务的执行时间,但实际上其效果并不理想。

>>> start_time = time.time()
>>> call_with_timeout(time.sleep, 2, timeout=3)
>>> elapsed_time = time.time() - start_time
>>> print('实际耗时:', elapsed_time)
实际耗时: 2.016767978668213

这看起来是正确的。

>>> start_time = time.time()
>>> call_with_timeout(time.sleep, 5, timeout=3)
>>> elapsed_time = time.time() - start_time
>>> print('实际耗时:', elapsed_time)
# 抛出TimeoutError

然而,这里的问题在于,尽管抛出了超时异常,但实际的执行时间仍然是5秒,而非预期的3秒。

针对这一问题,一些相关的解决方案建议使用线程池或信号处理来实现。但是,有没有一种方法可以在不使用多处理的私有API的情况下,在n秒后超时并终止进程?硬性终止进程是可以接受的,不一定需要优雅地关闭。

一个推荐的解决方案是使用pebble库。该库的ProcessPool设计旨在解决上述问题,即允许设置超时并取消正在运行的任务,而无需关闭整个进程池。当任务超时或被取消时,工作进程将被终止,从而停止执行预定的功能。

from pebble import ProcessPool

pool = ProcessPool(max_workers=1)
future = pool.schedule(func, args=args, timeout=1)
try:
result = future.result()
except TimeoutError:
print("任务超时")

具体实现如下:

def call_with_timeout(func, *args, timeout=3):
with ProcessPool(max_workers=1) as pool:
future = pool.schedule(func, args=args, timeout=timeout)
try:
return future.result()
except TimeoutError:
print("任务超时")

推荐阅读
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文将详细介绍NSRunLoop的工作原理,包括其基本概念、消息类型(事件源)、运行模式、生命周期管理以及嵌套运行等关键知识点,帮助开发者更好地理解和应用这一重要技术。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细解析了如何使用Python语言在STM32硬件平台上实现高效的编程和快速的应用开发。通过具体的代码示例,展示了Python简洁而强大的特性。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • Keras 实战:自编码器入门指南
    本文介绍了使用 Keras 框架实现自编码器的基本方法。自编码器是一种用于无监督学习的神经网络模型,主要功能包括数据降维、特征提取等。通过实际案例,我们将展示如何使用全连接层和卷积层来构建自编码器,并讨论不同维度对重建效果的影响。 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • Netty基础教程:构建简易Netty客户端与服务器
    Java NIO是解决传统阻塞I/O问题的关键技术之一,但其复杂性给开发者带来了挑战。Netty作为一个成熟的网络编程框架,极大地简化了这一过程。本文将通过一个简单的示例,介绍如何使用Netty创建基本的客户端和服务器。 ... [详细]
  • PyQt5结合QThread与ThreadPoolExecutor实现高效多任务处理
    本文探讨了如何利用PyQt5中的QThread模块解决用户界面在执行长时间操作时的卡顿问题,以及通过线程池ThreadPoolExecutor来优化多任务处理的效率。 ... [详细]
  • Working with Errors in Go 1.13
    作者|陌无崖 ... [详细]
  • 开发笔记:图像分割基于阙值+边缘检测+区域法图像分割matlab源码含GUI
    开发笔记:图像分割基于阙值+边缘检测+区域法图像分割matlab源码含GUI ... [详细]
author-avatar
没搜摸索摸索_685
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有