news 2026/4/3 5:53:54

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/1 22:40:00

Lyciumaker:解锁三国杀卡牌制作的无限创意可能

Lyciumaker:解锁三国杀卡牌制作的无限创意可能 【免费下载链接】Lyciumaker 在线三国杀卡牌制作器 项目地址: https://gitcode.com/gh_mirrors/ly/Lyciumaker 还在为无法找到合适的三国杀卡牌制作工具而苦恼吗?想要设计专属武将却不知从何入手&am…

作者头像 李华
网站建设 2026/3/26 4:19:12

5分钟搞定学术排版:上海交大LaTeX模板终极使用手册

5分钟搞定学术排版:上海交大LaTeX模板终极使用手册 【免费下载链接】SJTUThesis 上海交通大学 LaTeX 论文模板 | Shanghai Jiao Tong University LaTeX Thesis Template 项目地址: https://gitcode.com/gh_mirrors/sj/SJTUThesis 还在为论文格式问题头疼吗&a…

作者头像 李华
网站建设 2026/3/24 17:42:07

F3D三维查看器完整指南:如何秒开百种3D格式文件

F3D是一款专为效率而生的快速3D查看器,能够瞬间打开并渲染多种三维文件格式。无论是设计师查看CAD模型、工程师分析科学数据,还是普通用户预览3D作品,这款轻量级工具都能提供专业级的视觉体验。 【免费下载链接】f3d Fast and minimalist 3D …

作者头像 李华
网站建设 2026/3/27 16:15:03

Unitree机器人数字孪生技术实践指南

Unitree机器人数字孪生技术实践指南 【免费下载链接】go2_omniverse Unitree Go2, Unitree G1 support for Nvidia Isaac Lab (Isaac Gym / Isaac Sim) 项目地址: https://gitcode.com/gh_mirrors/go/go2_omniverse 在机器人技术快速发展的今天,数字孪生技术…

作者头像 李华
网站建设 2026/3/30 21:42:36

HTTP定时任务自动化框架:零基础快速搭建终极指南

HTTP定时任务自动化框架:零基础快速搭建终极指南 【免费下载链接】qd QD [v20230821] —— HTTP请求定时任务自动执行框架 base on HAR Editor and Tornado Server 项目地址: https://gitcode.com/gh_mirrors/qd/qd 想要实现HTTP请求的自动化定时执行&#x…

作者头像 李华