Для возвращения значений из синхронного колбека в корутину несколько раз можно использовать концепцию генератора. В Python есть специальное ключевое слово yield
, которое превращает функцию в генератор.
Подробнее примерно такой код будет выглядеть:
import asyncio async def my_coroutine(): def sync_callback(result): # Ваш синхронный коллбек coroutine.send(result) coroutine = my_generator() coroutine.send(None) # Запускаем генератор while True: try: result = await coroutine.asend(None) # Ожидаем ответ из генератора # Ваш код обработки результата print(result) except StopAsyncIteration: break def my_generator(): while True: value = yield # Получаем значение из генератора # Ваш код обработки значения print(value) asyncio.run(my_coroutine())
В этом примере my_coroutine()
является корутиной, которая затем вызывает генератор my_generator()
. Далее, мы используем цикл while
и ключевое слово asend()
, чтобы войти в генератор и отправить значение из корутины в генератор с помощью coroutine.send(result)
. После этого мы ожидаем результат из генератора с помощью await coroutine.asend(None)
. Этот процесс повторяется до тех пор, пока генератор не прекратится с помощью StopAsyncIteration
.
Этот код позволяет передавать значения из синхронного коллбека в корутину несколько раз. Вы можете изменить код синхронного коллбека под свои нужды, а также вставить свой код обработки полученных значений как в корутине, так и в генераторе.