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

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()
http://www.jsqmd.com/news/132755/

相关文章:

  • B站直播推流完整解决方案:告别官方限制的专业直播体验
  • 8分钟精通NVIDIA GPU容器化部署:实战配置手册
  • 抗干扰设计:risc-v五级流水线cpu工业部署指南
  • Everything PowerToys 插件:重新定义你的文件搜索体验
  • 14、Git分支合并:从基础到冲突解决
  • 如何用Winlator运行Windows程序:让手机变身移动办公神器
  • 基于GPT-SoVITS的情感化语音合成探索
  • 如何用Lyciumaker打造个性化三国杀武将卡牌
  • GPT-SoVITS性能评测:少样本条件下的语音自然度表现
  • 新手必看:DUT接入FPGA原型的基础流程
  • Unity Native Gallery 终极指南:快速实现跨平台相册交互功能
  • 上海交通大学LaTeX论文模板终极使用指南:快速掌握学术排版精髓
  • 3步解锁B站专业直播:开源推流助手完全指南
  • 如何快速配置安卓虚拟相机:完整使用指南与实战技巧
  • SSHFS-Win Manager 终极指南:5分钟学会Windows远程文件管理
  • 游戏NPC语音生成新玩法:GPT-SoVITS实战演示
  • AI视频补帧终极指南:让卡顿视频秒变丝滑的完整流程
  • ZLUDA终极指南:在AMD显卡上无缝运行CUDA应用的完整教程
  • MMseqs2中PDB数据库连接问题的深度解析与完整解决方案
  • 突破B站直播壁垒:轻松获取OBS推流码的完整指南
  • 终极指南:如何通过图形化工具轻松管理iOS固件?
  • 5分钟零代码搭建:Vue3数据大屏编辑器的终极指南 [特殊字符]
  • magnetW插件审核终极指南:从提交到发布的完整避坑手册
  • 苹果Silicon Mac上的Vivado安装与优化指南
  • FastReport开源报表工具:.NET开发者的数据可视化利器
  • 视频补帧终极指南:3步让你的视频流畅度翻倍
  • CEF4Delphi:如何让传统桌面应用无缝对接现代Web技术
  • YOLOv8n-face人脸检测实战:从零构建高性能跨平台部署方案
  • TFTPD64终极指南:Windows全能网络服务器快速配置教程
  • Read阅读书源终极配置教程:打造专属个人图书馆