Бесконечный цикл или «рекурсивный» в Asyncio - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в Python3 asyncio.

У меня есть функция, которая постоянно извлекает сообщения из соединения через веб-сокет.

Мне интересно, должен ли я использовать цикл while True илиasyncio.ensure_future рекурсивным способом.

Что является предпочтительным или не имеет значения?

Пример:

async def foo(websocket):
    while True:
        msg = await websocket.recv()
        print(msg)
        await asyncio.sleep(0.0001)

или

async def foo(websocket):
    msg = await websocket.recv()
    print(msg)
    await asyncio.sleep(0.0001)
    asyncio.ensure_future(foo(websocket))

1 Ответ

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

Я бы рекомендовал итерационный вариант по двум причинам:

  1. Его легче понять и расширить.Одним из преимуществ сопрограмм по сравнению с фьючерсами на основе обратных вызовов является то, что они позволяют использовать знакомые структуры управления, такие как if и while, для моделирования исполнения кода.Если вы хотите изменить свой код, например, добавить внешний цикл вокруг существующего или добавить некоторый код (например, другой цикл) после цикла, это будет значительно проще в нерекурсивной версии.

  2. Это более эффективно.Вызов asyncio.ensure_future(foo(websocket)) создает экземпляр нового объекта сопрограммы и совершенно новую задачу для каждой новой итерации.Хотя ни один из них не является особенно тяжелым, при прочих равных условиях, лучше избегать ненужного распределения.

...