python - 异步 Python 真的是异步的吗?

标签 python asynchronous python-asyncio aiohttp

使用 Python 3.6 和 asyncioaiohttp 我写了一个简单的异步程序:

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)它将“解放”资源。

关于python - 异步 Python 真的是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087429/

相关文章:

java - 对 GSM 电话/调制解调器进行编程以调用电话

php - 两个mysql表中的数据插入同步问题

django - 可以在 django 中异步执行数据库操作吗?

python-3.6 - 返回协程对象的 Python 异步函数

python - asyncio.queue 奇怪的行为

python - Python 3 相当于什么

python - 运行 Dockerized Django 应用程序时 Gunicorn 'Worker failed to boot'

python - 使用 scipy 在 python 中构建和更新稀疏矩阵

c# - 具有异步/等待方法调试的 Visual Studio 源服务器

exception - 如何捕获使用 Async.AwaitTask 运行的任务抛出的异常