Skip to main content
 首页 » 编程设计

python之异步 Python 真的是异步的吗

2025年05月04日20langtianya

使用 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") 

fetch(session, id) 中的 time.sleep(2) 使这个程序看起来不是异步的,因为它得到一个响应, sleep ,得到另一个, sleep 等等。当我删除 sleep 调用时,它似乎确实是异步/并发的,因为响应以随机顺序返回。在这种情况下,sleep 在做什么?它是否锁定了所有线程?为什么它看起来是顺序的而不是并行的?

请您参考如下方法:

time.sleep(2) 是同步(阻塞)调用,因此您要停止异步调用,您应该使用 await asyncio.sleep(2)它将“解放”资源。