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

原文地址

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

  • fetch 函数:用于发送请求并返回响应文本。
    delay 用于指定延迟时间
python 复制代码
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 用于等待所有任务完成,并收集它们的结果。
python 复制代码
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(...)) 启动和运行主协程,获取最终结果。
python 复制代码
if __name__ == '__main__':
	url = ''
	headers = ''
	payload = ''
	n = 100000
	delay = 0.1 # 单位是s
	loop = asyncio.get_event_loop()
	result = loop.run_until_complete(main(url, headers, payload, n, delay))
	get_lottery(result)
	

加锁

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

python 复制代码
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] += 1


def get_lottery(d):
    for key, value in d.items():
        lottery = value / n
        print(key + "的概率是:" + '{:.2%}'.format(lottery))
相关推荐
波诺波30 分钟前
通用装饰器示例
开发语言·python
程序员爱钓鱼1 小时前
Python编程实战 · 基础入门篇 | 变量与命名规范
后端·python
007php0071 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
惊鸿.Jh1 小时前
C++可变参数模板
开发语言·python
MoRanzhi12031 小时前
Pillow 基础图像操作与数据预处理
图像处理·python·深度学习·机器学习·numpy·pillow·数据预处理
素素.陈1 小时前
向RAGFlow中上传文档到对应的知识库
开发语言·python
小宁爱Python1 小时前
Django Web 开发系列(一):视图基础与 URL 路由配置全解析
后端·python·django
空影星1 小时前
SiriKali,一款跨平台的加密文件管理器
python·编辑器·电脑·智能硬件
阿_旭2 小时前
基于深度学习的甲状腺结节智能检测分割与诊断系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·甲状腺结节检测
woshihonghonga2 小时前
PyTorch矩阵乘法函数区别解析与矩阵高级索引说明——《动手学深度学习》3.6.3、3.6.4和3.6.5 (P79)
人工智能·pytorch·python·深度学习·jupyter·矩阵