python ThreadPoolExecutor Future

部署运行你感兴趣的模型镜像

一、代码结构与功能

这段代码演示了如何用线程池ThreadPoolExecutor)并发执行多个任务,并通过Future对象管理任务的执行和结果。


二、代码逐行详解

import time
from concurrent.futures import ThreadPoolExecutor, Future
  • 导入time模块用于模拟耗时操作。
  • 导入ThreadPoolExecutor(线程池执行器)和Future(异步任务结果对象)。

def fun(times):
    time.sleep(times)
    print(f'get html for {times} seconds')
    return times
  • 定义一个任务函数fun,参数times表示休眠的秒数。
  • 休眠times秒后,打印一条信息,并返回times

if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=2)
    task_time = [4, 2, 3]
    for i in task_time:
        future = executor.submit(fun, (i))

1. executor = ThreadPoolExecutor(max_workers=2)

  • 创建一个线程池对象,最多允许2个线程同时运行。
  • 线程池会自动管理线程的创建、复用和销毁。

2. task_time = [4, 2, 3]

  • 定义一个任务参数列表,表示要提交3个任务,分别耗时4秒、2秒、3秒。

3. for i in task_time:

  • 遍历任务参数列表。

4. future = executor.submit(fun, (i))

  • 注意:这里的(i)其实是一个单元素元组,等价于i
  • executor.submit(fun, i):向线程池提交一个任务,执行fun(i),返回一个Future对象。
  • Future对象用于跟踪任务的执行状态和结果。

三、ThreadPoolExecutor和Future的原理

1. ThreadPoolExecutor

  • 线程池会维护一个任务队列和一组工作线程。
  • 当你调用submit提交任务时,任务会被放入队列,空闲线程会自动取出任务执行。
  • max_workers=2表示最多2个线程并发执行任务,其余任务排队等待。

2. Future对象

  • Future是对异步任务的封装,可以用来:
    • 检查任务是否完成(done()
    • 获取任务结果(result(),会阻塞直到任务完成)
    • 取消任务(cancel()
    • 检查任务是否被取消(cancelled()

四、任务调度流程

  1. 提交任务:主线程依次提交3个任务(4秒、2秒、3秒)。
  2. 线程池调度
    • 最开始有2个线程空闲,分别执行4秒和2秒的任务。
    • 2秒任务先完成,线程池空出一个线程,立即开始执行3秒任务。
    • 4秒任务最后完成。
  3. 任务结果
    • 如果你用future.result()获取结果,会阻塞直到对应任务完成。

五、易错点说明

  • executor.submit(fun, (i))中的(i)其实是单元素元组,等价于i
    • 推荐直接写executor.submit(fun, i),更清晰。
  • 如果你想收集所有Future对象,应该用一个列表保存它们,便于后续获取结果或检查状态。

六、完整改进版代码(带结果获取)

import time
from concurrent.futures import ThreadPoolExecutor

def fun(times):
    time.sleep(times)
    print(f'get html for {times} seconds')
    return times

if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=2)
    task_time = [4, 2, 3]
    futures = []
    for i in task_time:
        future = executor.submit(fun, i)  # 推荐直接传i
        futures.append(future)
    for future in futures:
        result = future.result()  # 阻塞直到任务完成
        print(f'任务完成,返回值:{result}')

七、总结

  • 线程池通过submit方法并发执行任务,返回Future对象用于管理任务状态和结果。
  • 线程池能高效复用线程,限制并发数量,避免系统资源耗尽。
  • Future对象可用于获取任务结果、检查状态、取消任务等。
  • 推荐直接用executor.submit(fun, i),避免参数传递歧义。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贵哥的编程之路(热爱分享 为后来者)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值