Изучение asyncio: асинхронный запуск функции с задержкой - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь изучить asyncio уже несколько дней, и мне не удается заставить этот пример работать. Я хочу ускорить выполнение нескольких сотен HTTP-запросов, но хочу начать с простого. Я хотел бы иметь возможность указать, сколько запросов я хочу. У меня было много разных ошибок, так как я настраивал вещи, но не могу заставить его работать.

Вот мой код:

import asyncio
import time

async def say():
  print("Started")
  await time.sleep(3) #something that takes a long time like an http request
  print("Finsihed")

loop = asyncio.get_event_loop()
asyncio.gather(say(),say(),say())
loop.run_forever()

Мне это очень нужно и я уверен, что что-то делаю неправильно с запуском l oop, но я не знаю, что попробовать дальше. Спасибо за помощь.

1 Ответ

0 голосов
/ 13 июля 2020

Есть несколько проблем с вашим кодом:

  • Вы не можете использовать time.sleep() в коде asyncio, потому что вызов функции блокировки, такой как time.sleep(), блокирует все событие l oop.
  • Вы не можете просто вызвать asyncio.gather(), вы должны его дождаться.
  • Вероятно, вам следует использовать более новый и надежный asyncio.run() API, а не более старый loop.run_forever()

Вот код с исправленными проблемами:

import asyncio

async def say():
    print("Started")
    await asyncio.sleep(3)
    print("Finsihed")

async def main():
    await asyncio.gather(say(), say(), say())

asyncio.run(main())

Также обратите внимание, что вам нужно будет использовать асинхронную библиотеку, например aiohttp , чтобы правильно использовать asyncio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...