当前位置: 首页 > news >正文

使用 信号量(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: 设置最大并发数为3

  • sem = asyncio.Semaphore(3): 创建初始值为3的信号量

  • 信号量原理: 像一个计数器,acquire()减1,release()加1

  • async with sem: 相当于:

    await sem.acquire()  # 获取信号量(计数器-1)
    try:# 执行任务
    finally:sem.release()    # 释放信号量(计数器+1)
    主函数
  • 创建10个任务(但最多只有3个能同时运行)

  • asyncio.gather(*tasks): 并发运行所有任务

http://www.dtcms.com/a/380757.html

相关文章:

  • 1688 商品 API 实战指南:B2B 场景下的合规对接与批量运营方案
  • Qt Bridge for Figma
  • 解决docker配置了镜像源但还会拉取官方镜像源的问题
  • 【JavaEE】网络原理初识
  • 操作系统应用开发(七)mac苹果模拟器——东方仙盟练气期
  • PBI Plus 技术解析:全渠道协同架构下的数据协作效率提升方案​
  • 【C#】三个特殊的 Caller Info Attributes
  • LangChain4j入门学习
  • Django ORM 模型
  • 【SpringBoot】——原理篇
  • 机器人防爆的详细讲解
  • 【Vue3】06-利用setup编写vue(1)
  • 单序列双指针
  • Linux中进程和线程常用的API详解
  • 【AI论文】多模态大型语言模型的视觉表征对齐
  • php学习(第四天)
  • Vue中使用keep-alive实现页面前进刷新、后退缓存的完整方案
  • Jenkins运维之路(Jenkins流水线改造Day02-1-容器项目)
  • Netty从0到1系列之Netty逻辑架构【上】
  • com.google.common.cache实现本地缓存
  • LeetCode 面试经典 150 题之最后一个单词的长度:逆向遍历高效解法
  • 详解JWT
  • Spring Boot 分布式事务常见问题:Seata、XA 与本地消息表对比
  • 如何在Hugging Face中下载全部文件?
  • AI之VideoTool:AI-Video-Transcriber​​​​​​​的简介、安装和使用方法、案例应用之详细攻略
  • Qt6实现了一个打地鼠小游戏,支持AI自动打地鼠
  • Chapter5—抽象工厂模式
  • WebSocket连接状态监控与自动重连实现
  • 目标计数论文阅读(1)Class-Agnostic Counting
  • LVGL移植2048小游戏全攻略