Python中实现协程需使用async def定义协程函数,await暂停执行并交出控制权,事件循环通过asyncio.run()启动,实现单线程内高效并发I/O操作。

Python中实现协程,核心就是利用
async
await
asyncio
第一次接触
async/await
async def
await
await
asyncio.sleep
asyncio.run()
下面是一个简单的例子,展示了如何定义和运行协程:
import asyncio
import time
async def fetch_data(item_id, delay):
"""
模拟一个异步的网络请求或数据库查询。
它会等待一段时间,然后返回一些数据。
"""
print(f"[{time.strftime('%H:%M:%S')}] 正在为 {item_id} 模拟数据获取,预计等待 {delay} 秒...")
await asyncio.sleep(delay) # 这是一个可等待对象,会暂停当前协程,但不阻塞事件循环
print(f"[{time.strftime('%H:%M:%S')}] {item_id} 数据获取完成。")
return f"数据 for {item_id}"
async def process_items():
"""
主协程,负责创建并运行多个数据获取任务。
"""
print(f"[{time.strftime('%H:%M:%S')}] 开始处理所有项目...")
# 创建多个协程任务,它们将并发运行
task1 = asyncio.create_task(fetch_data("商品A", 3))
task2 = asyncio.create_task(fetch_data("商品B", 1))
task3 = asyncio.create_task(fetch_data("商品C", 2))
# 等待所有任务完成。await 会暂停当前协程,直到所有指定的任务都完成。
# 这里也可以使用 asyncio.gather() 来更优雅地等待多个任务。
result_a = await task1
result_b = await task2
result_c = await task3
print(f"[{time.strftime('%H:%M:%S')}] 所有项目处理完成。")
print(f"获取到的数据: {result_a}, {result_b}, {result_c}")
if __name__ == "__main__":
# 运行主协程。asyncio.run() 会自动管理事件循环的启动和关闭。
start_time = time.perf_counter()
asyncio.run(process_items())
end_time = time.perf_counter()
print(f"\n总耗时: {end_time - start_time:.2f} 秒")
在这个例子中,
fetch_data
process_items
asyncio.create_task
fetch_data
await
立即学习“Python免费学习笔记(深入)”;
很多人刚开始都会把协程和多线程搞混,这很正常。但它们俩的哲学完全不同。要理解
async/await
当一个协程遇到
await
await
await
这和多线程的抢占式多任务形成了鲜明对比:
所以,核心区别在于:多线程是操作系统级别的并行或并发,适用于CPU密集型任务(如果能绕开GIL的话)和I/O密集型任务;而协程是应用程序级别的并发,非常适合I/O密集型任务,因为它能以极低的开销实现大量并发连接,但对CPU密集型任务无能为力(因为仍然是单线程)。
这其实是个很实际的问题,不是所有场景都适合
async/await
你可以这样思考:
async/await
asyncio
什么时候不适合呢?
async/await
multiprocessing
asyncio
async/await
requests
async
asyncio.to_thread()
总而言之,
async/await
在
async/await
async def
常见的坑:
async
async def
time.sleep()
asyncio.sleep()
requests.get()
aiohttp
await asyncio.to_thread(sync_blocking_function, *args)
await
async def
await
RuntimeWarning: coroutine '...' was never awaited
my_coroutine()
await my_coroutine()
asyncio.create_task(my_coroutine())
await
asyncio.create_task()
asyncio.create_task()
await
await
await
await
try...except
done_callback
asyncio.gather()
asyncio.run()
asyncio.run()
await
asyncio.create_task()
调试技巧:
开启 asyncio
asyncio
python -m asyncio your_script.py
loop.set_debug(True)
await
import asyncio
async def main():
# ... your async code ...
pass
if __name__ == "__main__":
# 获取当前事件循环并设置调试模式
loop = asyncio.get_event_loop()
loop.set_debug(True)
# 运行主协程
loop.run_until_complete(main())
loop.close()(注意:
asyncio.run()
asyncio.run()
loop.set_debug(True)
asyncio.run()
debug=True
asyncio.run(main(), debug=True)
日志记录: 在关键的协程入口和出口添加日志,记录任务的开始、结束、以及任何重要状态。这有助于追踪任务的执行流程和发现异常。
使用 asyncio.all_tasks()
asyncio.all_tasks()
逐步调试器: 虽然调试异步代码比同步代码复杂一些,但像 VS Code 这样的IDE提供的调试器仍然非常有用。学会如何在
await
理解 asyncio.create_task()
await
create_task()
Task
Task
await
await
调试异步代码确实需要一些耐心和经验,但通过利用这些工具和理解其工作原理,你将能更有效地定位和解决问题。
以上就是python中怎么实现协程(async/await)?的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号