Python 3.5 中协程和 futuretask 之间的区别

作者:编程家 分类: python 时间:2025-08-25

Python 3.5引入了协程和future/task两个概念,它们都是用于在异步编程中处理并发任务的工具。本文将介绍协程和future/task的区别,并通过案例代码来说明它们的用法和特点。

协程和future/task的概念

在讲解协程和future/task之前,我们先来了解一下它们的概念。

协程是一种可以在程序执行过程中暂停和恢复的函数,也被称为"微线程"或"轻量级线程"。协程的特点是可以在一个线程内执行多个协程任务,通过暂停和恢复的方式来切换任务,从而实现并发执行。在Python中,协程通过async/await关键字来定义和使用。

Future和Task是协程的执行者,用于管理和调度协程的执行。Future代表了一个异步操作的结果,它可以被用于判断操作是否完成、获取操作的结果、添加回调函数等。Task是对Future的进一步封装,它是协程的最小执行单位,可以看作是一个可以被调度和取消的协程。

协程和future/task的区别

协程和future/task都是用于处理异步任务的工具,但它们在功能和用法上有一些区别。

1. 异步函数 vs. 异步对象:协程是异步函数,通过async/await关键字来定义和使用;而Future和Task是异步对象,用于管理和调度协程的执行。

2. 执行方式:协程是通过事件循环来执行的,事件循环负责调度协程任务的执行顺序;而Future和Task可以通过事件循环或线程池来执行。

3. 结果获取:协程通过await关键字来获取异步操作的结果,它会暂停当前协程的执行,等待异步操作完成;而Future通过result()方法来获取结果,它会阻塞当前线程直到操作完成。

4. 错误处理:协程可以使用try/except语句来捕获和处理异常,保证程序的正常执行;而Future可以通过add_done_callback()方法来添加回调函数,在异步操作完成后进行错误处理。

案例代码

下面的案例代码演示了如何使用协程和future/task来处理异步任务。

python

import asyncio

async def compute(x, y):

print("Compute %s + %s ..." % (x, y))

await asyncio.sleep(1.0)

return x + y

async def print_sum(x, y):

result = await compute(x, y)

print("%s + %s = %s" % (x, y, result))

loop = asyncio.get_event_loop()

tasks = [print_sum(1, 2), print_sum(3, 4)]

loop.run_until_complete(asyncio.wait(tasks))

loop.close()

在上面的代码中,我们定义了两个协程函数compute和print_sum,compute函数模拟了一个耗时的计算操作,print_sum函数调用了compute函数并打印出结果。通过asyncio.wait()方法将print_sum函数封装成Task对象,然后通过事件循环执行这些任务。

执行上述代码,可以看到输出结果为:

Compute 1 + 2 ...

Compute 3 + 4 ...

1 + 2 = 3

3 + 4 = 7

从输出结果可以看出,两个print_sum任务是并发执行的,并且在compute函数执行时会暂停当前任务的执行,等待计算操作完成后再继续执行。这就是协程和future/task的特点,它们可以实现高效的并发执行。

本文介绍了Python 3.5中协程和future/task的概念和区别。协程是一种可以在程序执行过程中暂停和恢复的函数,通过async/await关键字来定义和使用;而Future和Task是协程的执行者,用于管理和调度协程的执行。协程可以实现高效的并发执行,提高程序的性能和响应速度。在异步编程中,可以根据具体的需求选择使用协程和future/task来处理异步任务。