使用 信号量(Semaphore) 来控制异步任务并发数
例子
import asyncioCONCURRENCY = 3 # 最大并发数
sem = asyncio.Semaphore(CONCURRENCY)async def limited_task(task_id):async with sem: # 获取信号量print(f"任务 {task_id} 开始执行")await asyncio.sleep(1) # 模拟耗时操作print(f"任务 {task_id} 完成")async def main():# 创建多个任务tasks = [limited_task(i) for i in range(10)]await asyncio.gather(*tasks)# 运行
asyncio.run(main())
CONCURRENCY = 3
: 设置最大并发数为3sem = asyncio.Semaphore(3)
: 创建初始值为3的信号量信号量原理: 像一个计数器,
acquire()
减1,release()
加1async with sem:
相当于:await sem.acquire() # 获取信号量(计数器-1) try:# 执行任务 finally:sem.release() # 释放信号量(计数器+1)
主函数
创建10个任务(但最多只有3个能同时运行)
asyncio.gather(*tasks)
: 并发运行所有任务