Python-异步操作

介绍

Python 利用 asyncawait 关键字实现异步操作, 即允许并发而非阻塞执行程序.

  • 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) # Simulate time taken to cook rice
print("Rice is ready")

async def do_laundry():
print("Start laundry")
await asyncio.sleep(3) # Simulate time taken to do laundry
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) # Simulate time taken to cook rice
print("Rice is ready")

def do_laundry():
print("Start laundry")
time.sleep(3) # Simulate time taken to do laundry
print("Laundry is done")

with ProcessPoolExecutor() as executor:
executor.submit(cook_rice)
executor.submit(do_laundry)

总结

  • 并发: 任务交替进行, 适合 I/O 密集型任务. 用异步编程或多线程实现
  • 并行: 任务同时进行, 适合 CPU 密集型任务. 用多进程实现

Python-异步操作
http://example.com/2024/08/19/Python-异步操作/
作者
Jie
发布于
2024年8月19日
许可协议