news 2026/5/1 5:21:53

asyncio.Semaphore限制协程并发数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
asyncio.Semaphore限制协程并发数

众所周知,通常协程执行时,不像线程池、进程池一样可以限制最大数量,而且他也没有这个参数。
但是可以使用asyncio.Semaphore限制协程并发数。先看示例(文章基于python 3.10)

importaiohttpimportasyncioimporttimeimporttracebackasyncdefarequest_get(session,url,sem):asyncwithsem:# 使用的地方asyncwithsession.get(url)asresponse:returnf'{url}内容:{response.status}{awaitresponse.text()}'asyncdefmain():sem=asyncio.Semaphore(3)# 初始化并获取对象。asyncwithaiohttp.ClientSession()assession:urls=["https://example.com/a","https://example.com/b","https://example.com/c"]tasks=[asyncio.wait_for(arequest_get(session,url,sem),timeout=1)forurlinurls]results=awaitasyncio.gather(*tasks,return_exceptions=True)forindex,resultinenumerate(results,1):ifisinstance(result,asyncio.TimeoutError):print(f'任务{index}执行超时')elifisinstance(result,Exception):print(f'任务{index}出现未知错误:')print(traceback.format_tb(result.__traceback__))else:print(f'任务{index}输出:')print(result)if__name__=='__main__':print(time.time())asyncio.run(main())print(time.time())

信号量对象asyncio.Semaphore(value=1)

信号量对象。 该对象不是线程安全的。

信号量会管理一个内部计数器,该计数器会随每次acquire()调用递减并随每次release()调用递增。 计数器的值永远不会降到零以下;当acquire()发现其值为零时,它将保持阻塞直到有某个任务调用了release()

使用 Semaphore 的推荐方式是通过async with语句。:

sem=asyncio.Semaphore(10)# ... laterasyncwithsem:# work with shared resource

这等价于:

sem=asyncio.Semaphore(10)# ... laterawaitsem.acquire()try:# work with shared resourcefinally:sem.release()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 17:41:26

5步快速优化Windows:告别卡顿的终极方案

5步快速优化Windows:告别卡顿的终极方案 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 你的电脑是否经常出现开机慢、运行卡顿、…

作者头像 李华
网站建设 2026/4/29 7:47:35

IndexTTS2情感语音合成:5分钟掌握零样本语音克隆核心技术

IndexTTS2情感语音合成:5分钟掌握零样本语音克隆核心技术 【免费下载链接】index-tts An Industrial-Level Controllable and Efficient Zero-Shot Text-To-Speech System 项目地址: https://gitcode.com/gh_mirrors/in/index-tts 在人工智能语音技术快速发展…

作者头像 李华
网站建设 2026/4/21 12:54:37

Unitree机器人终极数字孪生指南:Nvidia Isaac Sim快速入门

Unitree机器人终极数字孪生指南:Nvidia Isaac Sim快速入门 【免费下载链接】go2_omniverse Unitree Go2, Unitree G1 support for Nvidia Isaac Lab (Isaac Gym / Isaac Sim) 项目地址: https://gitcode.com/gh_mirrors/go/go2_omniverse Unitree机器人数字孪…

作者头像 李华
网站建设 2026/4/28 9:40:33

rpatool终极指南:精通RenPy档案管理的完整教程

rpatool终极指南:精通RenPy档案管理的完整教程 【免费下载链接】rpatool A tool to work with RenPy archives. 项目地址: https://gitcode.com/gh_mirrors/rp/rpatool rpatool是一个功能强大的RenPy档案处理工具,专门用于创建、修改和提取RenPy游…

作者头像 李华
网站建设 2026/4/17 16:46:23

GPT-SoVITS多说话人模型训练方法研究

GPT-SoVITS多说话人模型训练方法研究 在智能语音交互日益普及的今天,用户对“个性化声音”的需求正迅速超越传统的标准化播报。无论是为虚拟偶像赋予独特声线,还是让AI助手模仿家人语气说话,如何用极少量语音数据快速克隆并生成高保真音色&am…

作者头像 李华
网站建设 2026/4/25 18:08:19

YOLOv8n-face人脸检测:从零搭建高效部署方案

YOLOv8n-face人脸检测:从零搭建高效部署方案 【免费下载链接】yolov8-face 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8-face 想要快速掌握业界领先的人脸检测技术吗?YOLOv8n-face作为YOLOv8架构的优化版本,在保持轻量化设计…

作者头像 李华