Не могу понять смысл асинхронности в этом коде. Это как это должно работать? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь использовать asyncio lib для того, чтобы мой код делал 3 HTTP-запроса GET / POST «одновременно», чтобы получить ответы как можно быстрее.(Иногда один или другой запрос задерживается, что приводит к задержке следующего.)

Итак, я пошел в asyncio docs и нашел этот пример: https://docs.python.org/3/library/asyncio-task.html#coroutines

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")

    await say_after(1, 'hello')
    await say_after(2, 'world')

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

Я на самом деле адаптировался под себя, но, похоже, это совсем не помогло, просто сделал код более сложным без каких-либо преимуществ.

При тестировании примера кода (см. Выше) Я предположил, что если я увеличу время задержки для первого say_after(), сначала будет напечатана вторая :

    await say_after(5, 'hello') #5 seconds of sleep before print
    await say_after(2, 'world')

Однако это не так.Возвращение было:

началось в 16: 04: 30

привет

world

закончено в 16: 04: 37

Так какова цель этого асинхронного кода? Я мог бы получить тот же результат без асинхронного:

def say_after_b(delay, what):
    time.sleep(delay)
    print(what)

def main_b():
    print(f"started at {time.strftime('%X')}")

    say_after_b(5, 'hello')
    say_after_b(2, 'world')

    print(f"finished at {time.strftime('%X')}")

main_b()

return:

началось в 16: 04: 37

привет

world

закончено в 16: 04: 44

То, как я это вижуасинхронный код с увеличенным временем должен был выглядеть следующим образом:

сон 1 сек> сон 2 сек> печать («мир»)> сон 3 сек> сон 4 сек> сон 5 сек> печать ('привет')> Конец.

Мое предположение неверно?

1 Ответ

1 голос
/ 05 июня 2019

Прочитайте один дополнительный абзац в документах, которые вы упомянули.

Над примером кода, который вы цитируете, четко написано

Следующий фрагмент кода напечатает «привет» после ожиданияв течение 1 секунды, а затем выведите «world» после ожидания еще 2 секунды

, а следующий пример -

одновременное выполнение двух сопрограмм say_after

(подсказка: вам нужно создавать задачи для одновременного запуска сопрограмм)

...