Python asyncio 异步协程核心用法与生命周期管理

Alice
Alice
发布时间:2026-10-15 | 4人浏览过
原创

本文详解 Python asyncio 库中异步协程的定义、执行与生命周期管理。涵盖协程基础概念、GIL 限制、任务运行方式、回调函数处理,以及 run_forever 模式下多协程的优雅关闭策略,帮助开发者掌握异步编程核心机制。

一、定义协程

  • 在 asyncio 中执行的任务被称为协程,但需注意 asyncio 本身并不提供真正的并行处理能力。
  • 受限于 Python 的全局解释器锁(GIL),多线程同样无法实现真正的并行计算。
import asyncio
# 通过 async 定义一个协程
async def task():
print('这是一个协程')
# 判断是否是一个协程,返回True
print(asyncio.iscoroutinefunction(task))

二、运行协程

import asyncio
# 通过 async 定义一个协程
async def task(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
print('协程结束')
# 协程运行
loop = asyncio.get_event_loop()
loop.run_until_complete(task(3))

三、协程回调

  • 当协程任务处理完毕后,若需通知开发人员程序已结束,
  • 则必须使用协程回调机制。
import asyncio
# 通过 async 定义一个协程
async def task(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
return '这里task结束了,其他的继续吧'
def callback(future):
print(future.result())
future = asyncio.ensure_future(task(3))
future.add_done_callback(callback)
loop = asyncio.get_event_loop()
loop.run_until_complete(future)
# 结果如下:
# 请等待 3 秒
# 这里task结束了,其他的继续吧

四、运行多个协程

  • 在实际项目中,通常涉及多个协程的同时执行。
  • 此时需要借助 asyncio.gather 函数来协调运行。
import asyncio
# 通过 async 定义一个协程
async def task1(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
print('这里task1结束了')
# 通过 async 定义一个协程
async def task2(s):
print('请等待 {} 秒'.format(s))
await asyncio.sleep(s)
print('这里task2结束了')
# 运行方法一
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(task1(1), task2(3)))
# 运行方法二
coros = [task1(1), task1(3)]
loop.run_until_complete(asyncio.gather(*coros))
# 结果如下:
# 请等待 1 秒
# 请等待 3 秒
# 这里task1结束了
# 这里task2结束了

五、run_forever

  • 通过 run_until_complete 运行协程时,一旦协程执行完毕,程序便会结束并退出。
  • 若改用 run_forever 运行,程序不会自动退出,除非显式调用 loop.stop()。
import asyncio
# 通过 async 定义一个协程
async def task(s):
await asyncio.sleep(s)
# 程序并未退出结束
loop = asyncio.get_event_loop()
asyncio.ensure_future(task(3))
loop.run_forever()
  • 如需手动退出,必须调用 loop.stop()。
  • 该调用可在协程内部执行。
import asyncio
# 通过 async 定义一个协程
async def task(loop, s):
await asyncio.sleep(s)
# 关闭run_forever
loop.close()
loop = asyncio.get_event_loop()
asyncio.ensure_future(task(loop, 3))
loop.run_forever()

六、多协程中关闭 run_forever

  • 单个协程可通过内部逻辑关闭,但在存在两个以上协程的场景下,
  • 若其中一个协程提前完成并调用 stop,将导致其他协程异常退出,这是不允许的行为。
  • 因此,建议在回调函数中统一执行关闭操作。
import asyncio, functools
async def task(x):
await asyncio.sleep(x)
print('这是协程任务')
def callback(loop):
loop.stop()
loop = asyncio.get_event_loop()
future = asyncio.gather(task(1), task(3))
future.add_done_callback(functools.partial(callback, loop))
loop.run_forever()

到此这篇关于 python 中的 asyncio 异步协程 IO 教程的文章就介绍到这了,更多相关python 异步协程 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表