Python Async Функциональность - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь выяснить, как работает асинхронная функциональность в Python. Я смотрел бесчисленное количество видео, но, думаю, я не «понял». Мой код выглядит следующим образом:

def run_watchers():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(watcher_helper())
    loop.close()

async def watcher_helper():
    watchers = Watcher.objects.all()

    for watcher in watchers:
        print("Running watcher : " + str(watcher.pk))
        await watcher_helper2(watcher)

async def watcher_helper2(watcher):
    for i in range(1,1000000):
        x = i * 1000 / 2000

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

Я ожидаю следующий вывод:

Running watcher : 1
Running watcher : 2
...
...

Calculation done
Calculation done
...
...

однако я получаю:

Running watcher : 1
Calculation done
Running watcher : 2
Calculation done
...
...

, который, очевидно, показывает, что вычисления не выполняются параллельно. Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 02 мая 2018

asyncio может использоваться только для ускорения нескольких функций, связанных с сетевым вводом / выводом (отправка / получение данных через Интернет). Пока вы ждете некоторые данные из сети (что может занять много времени), вы обычно бездействуете. Использование asyncio позволяет использовать этот простой для другой полезной работы: например, для запуска другого параллельного сетевого запроса.

asyncio не может каким-то образом ускорить работу, связанную с процессором (что и делает watcher_helper2 в вашем примере). Хотя вы умножаете некоторые числа, просто нет времени простоя, которое можно использовать, чтобы сделать что-то другое и добиться от этого выгоды.

Читайте также этот ответ для более подробного объяснения.

...