python - async Python 真的是异步的吗?
问题描述
使用 Python 3.6 并且asyncio
我aiohttp
编写了一个简单的异步程序:
from aiohttp import ClientSession
import asyncio, ssl, time
base_url = 'https://my-base-url.com/api'
async def fetch(session, id):
query_params = {'qp1':'v1','qp2':'v2', 'id': id}
async with session.get(base_url, params=query_params, ssl=ssl.SSLContext()) as response:
res_json = await response.json()
if response.status == 200:
time.sleep(2)
min_rating = res_json.get('minRating')
max_rating = res_json.get('maxRating')
print("id = %s, min = %s, max = %s" % (id, min_rating, max_rating))
async def run(ids):
tasks = []
async with ClientSession() as session:
for id in ids:
task = asyncio.ensure_future(fetch(session, id))
tasks.append(task)
responses = await asyncio.gather(*tasks)
return responses
if __name__ == '__main__':
ids = [123, 456, 789]
future = asyncio.ensure_future(run(ids))
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(future)
print("\n\ndone")
内部使这个程序看起来不是异步的time.sleep(2)
,fetch(session, id)
因为它得到一个响应,休眠,得到另一个,休眠,等等。当我删除睡眠呼叫时,它似乎是异步/并发的,因为响应以随机顺序返回。sleep
在这种情况下在做什么?它是否锁定所有线程?为什么它看起来是顺序的而不是并行的?
解决方案
time.sleep(2)
是同步(阻塞)调用,因此您正在停止异步调用,您应该使用await asyncio.sleep(2)
它将“释放”资源。
推荐阅读
- python - 如何使用 plotnine 对堆积条进行排序
- node.js - 如何使用 CLI 将 Microsoft botbuilder nodejs 应用程序部署到 azure?
- r - 如何通过统计数据获得混淆矩阵?
- sql - 从组中排除最小值
- android - 用许多项目填充 ScrollView 需要太长时间
- c# - C# Console.WriteLine 不在一行中打印
- python - MouseTracking 事件似乎不起作用
- ios - 使用聚类避免谷歌地图标记重叠
- xcode - 声明出现在快速帮助文档的中间
- jquery - 如何在使用 Jquery 在 MVC 中进行分页时从 Kendo Grid UI 中获取复选框选定的行值