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

原文地址

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

  • 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))
相关推荐
nuowenyadelunwen几秒前
Harvard CS50 Week 6 Python
开发语言·python
饼干,2 分钟前
期末考试3
开发语言·人工智能·python
曲幽5 分钟前
FastAPI响应实战:从JSON到HTML,轻松驾驭多种数据格式
python·html·json·fastapi·web·jinja2·responses
jackylzh5 分钟前
数据集标签文件转换方法--将 XML 文件类型转化为 TXT 文件类型
人工智能·python·深度学习
linuxxx1109 分钟前
request.build_absolute_uri()为什么没有获得端口?
python·nginx·django
小北方城市网9 分钟前
第 5 课:后端工程化进阶 ——Python 分层架构 + 中间件 + 日志 / 异常统一处理(打造企业级高可用后端)
数据库·人工智能·python·mysql·数据库架构
山山而川 潺潺如镜9 分钟前
python防止程序多开,但程序运行脚本
android·开发语言·python
大千AI助手19 分钟前
HiveOperator 中 hql 模板路径解析失败的原因分析
hive·python·任务调度·airflow·模版·大千ai助手·hiveoperator
小北方城市网20 分钟前
第 4 课:前端工程化进阶 ——Vue 核心语法 + 组件化开发(前端能力质的飞跃)
大数据·开发语言·数据库·python·状态模式·数据库架构
㳺三才人子24 分钟前
初探 Python + Django
开发语言·python·django