python线程池

文章介绍了如何使用Python的concurrent.futures模块创建线程池并发执行任务,以及Future对象在异步编程中的作用。通过`ThreadPoolExecutor`提交任务,`Future`对象代表任务的未来结果,可以实现非阻塞处理。
摘要由CSDN通过智能技术生成
import concurrent.futures
import time

def task(num):
    print(f"Running task {num}")
    # 休眠20ms
    time.sleep(3)
    return num ** 2

# 创建线程池
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool:
    # 提交任务给线程池
    results = [pool.submit(task, i) for i in range(5)]

    # 获取任务的结果
    for future in concurrent.futures.as_completed(results):
        result = future.result()
        print(f"Task result: {result}")

输出:

Running task 0
Running task 1
Running task 2
Running task 3
Task result: 1
Task result: 0
Running task 4
Task result: 4
Task result: 9
Task result: 16

在上面的例子中,我们定义了一个名为task的简单任务,接收一个数字作为参数,并返回其平方。

在主程序中,我们创建了一个最大线程数为2的线程池,并使用pool.submit方法提交了5个任务。submit方法返回一个concurrent.futures.Future对象,它代表了一个任务的未来结果。

在concurrent.futures.as_completed函数中,我们循环遍历results列表中的每个Future对象。当其中一个任务完成时,as_completed函数会返回该任务的Future对象。我们可以通过调用future.result()来获取任务的结果。

在输出中,你会看到任务是并发执行的,因为线程池中有2个线程可供使用。每个任务的结果都会被打印出来。

这只是一个简单的例子,演示了如何使用线程池并发执行任务。你可以根据自己的需求定制任务的逻辑和处理结果的方式。另外,你也可以根据实际需求调整线程池的最大线程数。

为什么是future

Future 对象表示一个异步计算的未来结果,它是并发编程中常用的概念之一。它提供了一种非阻塞式的方式来处理异步任务,并在任务完成后获取结果。

为什么称之为"未来"(future)呢?因为 Future 对象代表了一个尚未完成的操作或计算,它的结果可能已经存在,但也可能在稍后才会得到。通过使用 Future 对象,我们可以在不阻塞程序执行的情况下,去处理其他任务,然后在需要结果时再获取。

concurrent.futures.Future 是 Python 标准库 concurrent.futures 中提供的一个类,用于表示异步操作的结果。它是对底层的线程、进程等进行封装和管理的一种方式。

在示例代码中,当我们通过调用 pool.submit() 提交任务时,它返回一个 Future 对象,代表了该任务的未来结果。我们可以将这些 Future 对象收集起来,并使用 concurrent.futures.as_completed() 或 concurrent.futures.wait() 等方法来等待任务完成并获取结果。

通过 future.result() 方法获取 Future 对象的结果是一种阻塞操作,也意味着当前线程会等待结果的计算完成。只有在结果计算完成后,才会返回计算结果或触发相应的异常(如果计算过程中出现错误)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值