concurrent.futures

本文介绍了并发编程中future的概念及其在Python concurrent.futures模块的应用。详细解释了future如何作为替代result的对象,以及concurrent.futures接口如何通过线程或进程工作池运行任务。并通过示例展示了使用submit(), map()及as_completed()进行单任务和多任务调度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 关于 future

在很多语言的并发编程中,你经常可以看到 future 的身影。future 的引入实际上是一种设计思想,它描述了一个替代 result 的对象,future 中的 result 通常是一开始未知,随着计算完成而变得已知。

并发启动计算获得最终计算结果之间存在一段空隙,future 在这个空隙间架了座桥。通常的处理这段空隙的方法是传递一个同步队列到每个worker,然后一旦workers结束,收集结果。但 future 使得这个过程更容易、更优雅。

2. 关于concurrent.futures接口

concurrent.futures提供了使用线程或进程工作池(pools of workers)来运行任务的接口。这个API使得多线程和多进程并发变得非常类似。它是在threadingmultiprocessing接口上的封装。

Executors被用来管理工作池;futures被用来管理workers运行的结果。

首先创建Executor的实例,然后submit任务来运行。当任务开始时,Future的实例被返回。当任务结果被需要时,你能够使用Future来阻塞直到获得结果。

3. 接口详解

(1)调度单个任务

executor调度单个任务,使用submit()函数,然后用返回的Future实例等待任务结果。

Code Example

from concurrent import futures
import time
import random


def task(n):
    time.sleep(random.randint(1, 10))
    return n


executor = futures.ThreadPoolExecutor(max_workers=3)
future = executor.submit(task, 5)
print('future: {}'.format(future))
result = future.result()
print('result: {}'.format(result))

output

future: <Future at 0x109c55210 state=running>
result: 5

(2)使用map()调度多任务,有序返回

使用map(),多个worker并发地从输入迭代器里取数据,处理,然后按顺序返回结果。

Code Example

from concurrent import futures
import time
import random


def task(n):
    time.sleep(random.randint(1, 10))
    return n


executor = futures.ThreadPoolExecutor(max_workers=3)
results = executor.map(task, xrange(1, 10))
print('unprocessed results: {}'.format(results))
real_results = list(results)
print('real results: {}'.format(real_results))

output

unprocessed results: <generator object result_iterator at 0x10fa19d70>
real results: [1, 2, 3, 4, 5, 6, 7, 8, 9]

(3)多任务调度,无序返回

不断将任务submitexecutor,返回future列表,使用as_completed无序产生每个任务的结果。

Code Example

from concurrent import futures
import random
import time


def task(n):
    time.sleep(random.randint(1, 10))
    return n


executor = futures.ThreadPoolExecutor(max_workers=3)
future_list = [executor.submit(task, i) for i in xrange(1, 10)]
for f in futures.as_completed(future_list):
    print(f.result())

output

1
4
2
3
7
6
5
8
9


Ref

Python - paralellizing CPU-bound tasks with concurrent.futures

concurrent.futures — Manage Pools of Concurrent Tasks

### Concurrent.FuturesFutures 模块对比 #### 并发编程模型支持 `concurrent.futures` 是 Python 标准库的一部分,提供了高层次接口来管理线程池和进程池。而 `futures` 实际上是指 `concurrent.futures` 中的对象实例化后的表现形式[^1]。 #### 主要组件差异 - **ThreadPoolExecutor**: 使用于多线程场景,在 `concurrent.futures` 下定义用于简化创建大量工作线程的过程。 - **ProcessPoolExecutor**: 针对多进程设计,允许利用多个CPU核心并行处理任务,同样属于 `concurrent.futures` 的一部分[^2]。 #### API 设计哲学区别 `concurrent.futures` 提供了统一的API来操作不同类型的执行器(Executors),无论是基于线程还是进程的任务提交方式都保持一致;相比之下,“纯” futures 更多地指代由这些执行器返回的结果对象——Future 类型实体。 ```python from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed def task(n): return n * n # Using ThreadPoolExecutor with submit and as_completed with ThreadPoolExecutor(max_workers=4) as executor: future_to_num = {executor.submit(task, i): i for i in range(5)} for future in as_completed(future_to_num): num = future_to_num[future] try: result = future.result() print(f'Task({num}): {result}') except Exception as exc: print(f'{num} generated an exception: {exc}') # Using ProcessPoolExecutor similarly with ProcessPoolExecutor() as executor: results = list(executor.map(task, range(5))) print('Results:', results) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值