热门标签 | 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脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细解析了如何使用Python语言在STM32硬件平台上实现高效的编程和快速的应用开发。通过具体的代码示例,展示了Python简洁而强大的特性。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • Keras 实战:自编码器入门指南
    本文介绍了使用 Keras 框架实现自编码器的基本方法。自编码器是一种用于无监督学习的神经网络模型,主要功能包括数据降维、特征提取等。通过实际案例,我们将展示如何使用全连接层和卷积层来构建自编码器,并讨论不同维度对重建效果的影响。 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
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社区 版权所有