Должен ли я использовать сопрограммы для синхронного кода из асинхронного кода? - PullRequest
1 голос
/ 31 января 2020

Если мне нужно вызвать некоторый синхронный код из сопрограммы, имеет ли значение, если я использую сопрограмму для этого синхронного кода?

Пример: имеет ли значение, если я использую get_hello или coro_get_hello? А если нет, то какой правильный / предпочтительный способ?

import asyncio
import re


class Foo:
    def get_hello(self, string):
        return re.findall(r"(H.+?)\n", string)

    async def coro_get_hello(self, string):
        return re.findall(r"(H.+?)\n", string)

    async def worker(self):
        my_string = "Hello\nWorld\n" * 200
        for _ in range(5):
            print(await self.coro_get_hello(my_string))
            print(self.get_hello(my_string))
            await asyncio.sleep(1)

    def start(self):
        asyncio.run(self.worker())


if __name__ == "__main__":
    Foo().start()```

1 Ответ

1 голос
/ 31 января 2020

Основной смысл использования async def / await заключается в явной маркировке мест в коде, где может произойти переключение контекста (где поток выполнения может переключиться на другую сопрограмму). Меньше таких мест - проще обрабатывать параллельный код. Таким образом, не создавайте сопрограмму функции, если у вас нет для этого какой-либо причины.

По какой причине вы должны создавать сопрограмму функции?

  • Если это функция должна await некоторая сопрограмма, она должна быть сопрограммой либо
  • Если функция должна await некоторый Future или другой асинхронный c объект, она должна быть определил сопрограмму
  • Если функция не нуждается в await для чего-либо, но она будет вызываться внутри другой сопрограммы, а вызов функции занимает много времени . В этом случае имеет смысл вызывать функцию в потоке асинхронно и await поток завершается.

Вы можете прочитать об этом подробнее здесь (и в обсуждении под ответом).

...