Как вернуть значения из синхронного колбека в corotine несколько раз?

Для возвращения значений из синхронного колбека в корутину несколько раз можно использовать концепцию генератора. В 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.

Этот код позволяет передавать значения из синхронного коллбека в корутину несколько раз. Вы можете изменить код синхронного коллбека под свои нужды, а также вставить свой код обработки полученных значений как в корутине, так и в генераторе.