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

使用协程实现调用接口 验证抽奖概率

原文地址
在原先的基础上使用协程进行改进,提高效率

  • fetch 函数:用于发送请求并返回响应文本。
    delay 用于指定延迟时间
async def fetch(session, url, headers, payload, delay=0):await asyncio.sleep(delay)async with session.post(url, headers=headers, data=payload, ssl=False) as response:return await response.text()
  • main 函数:创建一个 aiohttp.ClientSession 会话,并启动多个并发的 fetch 任务。asyncio.gather 用于等待所有任务完成,并收集它们的结果。
async def main(url, headers, payload, n, delay):d = defaultdict(int)lock = asyncio.Lock()  # 创建锁async with aiohttp.ClientSession() as session:tasks = [fetch_and_update(session, url, headers, payload, d, lock, delay) for _ in range(n)]await asyncio.gather(*tasks)return d
  • 任务列表:tasks 列表包含了 n 个 fetch 任务。
  • 解析响应:所有响应返回后,逐个解析 JSON 数据并更新结果字典 d。
  • 运行主协程:使用 asyncio.get_event_loop() 和 loop.run_until_complete(main(…)) 启动和运行主协程,获取最终结果。
if __name__ == '__main__':url = ''headers = ''payload = ''n = 100000delay = 0.1 # 单位是sloop = asyncio.get_event_loop()result = loop.run_until_complete(main(url, headers, payload, n, delay))get_lottery(result)

加锁

由于是对同一个字典进行操作,需要保证操作的线程安全性,保证数据一致性,需要加锁处理 ,使用asyncio.Lock


async def fetch_and_update(session, url, headers, payload, d, lock, delay):response = await fetch(session, url, headers, payload, delay)jsonobj = json.loads(response)reward_name = jsonobj['']async with lock:  # 确保对字典的访问是线程安全的d[reward_name] += 1def get_lottery(d):for key, value in d.items():lottery = value / nprint(key + "的概率是:" + '{:.2%}'.format(lottery))

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue-快速入门
  • 周末两天我搭建了一个智能问答ai工具网站
  • vue3——利用自定义指令实现下拉框分页懒加载
  • 前端模块化CommonJS、AMD、CMD、ES6
  • MYSQL(2) 高级查询
  • sql注入 mysql 执行命令 sql注入以及解决的办法
  • C语言 #具有展开功能的排雷游戏
  • WHAT - 不同 HTTP Methods 使用场景、使用方法和可能遇到的问题
  • 力扣1089复写0
  • JVM 性能分析—— 一文带你读懂 G1 垃圾收集器收集流程
  • 鸿蒙应用框架开发【OpenGL三棱椎】 NDK
  • postgres数据库连接超时问题处理
  • ArcGIS Pro SDK (九)几何 17 几何引擎函数
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • C# 委托函数 delegate
  • download使用浅析
  • HashMap ConcurrentHashMap
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • leetcode-27. Remove Element
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Nodejs和JavaWeb协助开发
  • PhantomJS 安装
  • Python socket服务器端、客户端传送信息
  • Vue UI框架库开发介绍
  • 不上全站https的网站你们就等着被恶心死吧
  • 多线程 start 和 run 方法到底有什么区别?
  • 排序算法之--选择排序
  • 区块链技术特点之去中心化特性
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • linux 淘宝开源监控工具tsar
  • NLPIR智能语义技术让大数据挖掘更简单
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​Redis 实现计数器和限速器的
  • ​ssh免密码登录设置及问题总结
  • ​如何在iOS手机上查看应用日志
  • !!java web学习笔记(一到五)
  • $nextTick的使用场景介绍
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2)STL算法之元素计数
  • (3)(3.5) 遥测无线电区域条例
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (纯JS)图片裁剪
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (利用IDEA+Maven)定制属于自己的jar包
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十三)Maven插件解析运行机制
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)大道至简,职场上做人做事做管理
  • (转载)hibernate缓存
  • .env.development、.env.production、.env.staging
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net