news 2026/4/16 19:33:52

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/16 10:17:07

如何通过游戏帧率优化工具实现性能大提升实用指南

如何通过游戏帧率优化工具实现性能大提升实用指南 【免费下载链接】Genshin_StarRail_fps_unlocker Genshin Impact & HKSR Fps Unlock 原神崩铁帧率解锁 项目地址: https://gitcode.com/gh_mirrors/ge/Genshin_StarRail_fps_unlocker 还在为《原神》和《崩坏&#…

作者头像 李华
网站建设 2026/4/16 15:33:41

Everything PowerToys 终极效率实战指南

Everything PowerToys 终极效率实战指南 【免费下载链接】EverythingPowerToys Everything search plugin for PowerToys Run 项目地址: https://gitcode.com/gh_mirrors/ev/EverythingPowerToys 你是否曾因寻找某个重要文件而浪费宝贵时间?当传统文件搜索让…

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

城市道路可视化完全指南:一键掌握全球城市脉络

City-Roads是一款基于WebGL技术的开源城市道路可视化工具,能够快速渲染全球任意城市的完整道路网络。无论您是城市规划师、地理爱好者还是普通用户,都能通过这个工具以前所未有的视角探索城市的内在结构,实现城市道路可视化的一键式操作。 【…

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

零基础入门es客户端工具的日常维护操作

零基础也能上手:用curl玩转 Elasticsearch 日常运维你有没有遇到过这种情况:系统报警说“ES集群状态变红”,你打开Kibana却卡得打不开;或者想批量删几个日志索引,点来点去发现GUI根本不支持?这时候&#xf…

作者头像 李华
网站建设 2026/4/16 7:30:33

GPT-SoVITS语音去噪处理最佳实践

GPT-SoVITS语音去噪处理最佳实践 在短视频、播客与虚拟人内容爆发的今天,个性化语音合成已不再是大厂专属的技术壁垒。越来越多的独立创作者希望用自己的声音批量生成音频内容,但传统TTS系统动辄需要数小时高质量录音才能训练出可用模型,这让…

作者头像 李华
网站建设 2026/4/16 7:22:03

YOLOv8n-face人脸检测终极指南:3分钟掌握完整配置技巧

想要快速上手高性能的人脸检测模型吗?YOLOv8n-face正是你需要的解决方案!这款基于YOLOv8架构优化的专业人脸检测模型,在保持惊人精度的同时大幅提升了检测速度,今天就来带大家完整了解这款强大的工具。 【免费下载链接】yolov8-fa…

作者头像 李华