news 2026/11/5 22:36:56

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/11/4 12:06:15

时钟电路设计原理在Altium Designer中的实现详解

时钟电路设计:从原理到Altium Designer实战的完整路径在现代电子系统中,时钟信号远不止是一个周期性的方波。它是整个数字系统的“心跳”——所有操作都依赖于它进行同步与协调。一旦这个“脉搏”出现抖动、偏移或失稳,轻则数据出错&#xff…

作者头像 李华
网站建设 2026/11/5 13:15:42

Whisky终极配置指南:解锁macOS运行Windows程序的隐藏潜能

Whisky终极配置指南:解锁macOS运行Windows程序的隐藏潜能 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为macOS上运行Windows程序卡顿、闪退、中文乱码而头疼吗&am…

作者头像 李华
网站建设 2026/11/3 1:57:56

FDS火灾模拟实战精通:从零基础到专业级应用进阶

FDS火灾动力学模拟器是业界公认的专业级开源仿真软件,专门用于模拟低速流动条件下的火灾发展过程。这款工具能够精确预测烟雾扩散路径、温度分布变化以及有毒气体浓度,为建筑消防设计、安全评估和应急预案制定提供科学依据。无论您是消防工程专业人员、安…

作者头像 李华
网站建设 2026/11/3 1:57:55

YOLOv8n-face人脸检测:从零开始的实战指南

YOLOv8n-face人脸检测:从零开始的实战指南 【免费下载链接】yolov8-face 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8-face 为什么选择YOLOv8n-face进行人脸识别? 在当今的AI应用中,人脸检测技术已经成为智能监控、人脸支付…

作者头像 李华
网站建设 2026/11/3 21:44:16

ScriptHookV终极指南:从零开始掌握GTA V模组开发

ScriptHookV终极指南:从零开始掌握GTA V模组开发 【免费下载链接】ScriptHookV An open source hook into GTAV for loading offline mods 项目地址: https://gitcode.com/gh_mirrors/sc/ScriptHookV 想要为GTA V打造专属游戏体验?ScriptHookV就是…

作者头像 李华
网站建设 2026/11/4 6:10:41

B站直播推流完全指南:告别官方限制的专业解决方案

B站直播推流完全指南:告别官方限制的专业解决方案 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直播分区和标题功能 …

作者头像 李华