介绍
Python 利用 async
和 await
关键字实现异步操作, 即允许并发而非阻塞执行程序.
async
关键字用于定义异步函数, 其返回一个协程对象
await
关键字用于等待异步函数的执行
示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| import asyncio
async def say_hello(): print("Hello") await asyncio.sleep(1) print("World")
async def main(): task1 = asyncio.create_task(say_hello()) task2 = asyncio.create_task(say_hello()) await asyncio.gather(task1, task2)
asyncio.run(main())
|
这里 asyncio
是一个标准库, 用于支持 python 的异步编程.
asyncio.create_task(coro)
用于创建异步任务
asyncio.run(coro)
用于运行一个协程
await asyncio.sleep(seconds)
用于模拟异步等待
await asyncio.gather(*coros)
用于并行运行多个协程
区分并发和并行
并发
并发指的是在同一时间段内管理多个任务. 任务可能会在同一时间交替进行,但并不一定同时执行. 主要用于提高程序的响应性和资源利用率.
如, 假设你在煮饭和洗衣服:
- 当饭在锅里煮时,你可以去洗衣服。
- 两个任务交替进行,但你一次只能专注于一个任务。
在编程中通常借助协程和线程的概念实现;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import asyncio
async def cook_rice(): print("Start cooking rice") await asyncio.sleep(2) print("Rice is ready")
async def do_laundry(): print("Start laundry") await asyncio.sleep(3) print("Laundry is done")
async def main(): await asyncio.gather(cook_rice(), do_laundry())
asyncio.run(main())
|
并行
并行指的是在同一时刻同时执行多个任务. 这需要多核处理器, 每个任务可以在不同的核心上同时运行.
如, 假设你和朋友一起做家务:
在编程中, 通常借助多进程实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from concurrent.futures import ProcessPoolExecutor import time
def cook_rice(): print("Start cooking rice") time.sleep(2) print("Rice is ready")
def do_laundry(): print("Start laundry") time.sleep(3) print("Laundry is done")
with ProcessPoolExecutor() as executor: executor.submit(cook_rice) executor.submit(do_laundry)
|
总结
- 并发: 任务交替进行, 适合 I/O 密集型任务. 用异步编程或多线程实现
- 并行: 任务同时进行, 适合 CPU 密集型任务. 用多进程实现