python3 asyncio ждет при обратном вызове

1
задан Einzig7 13 July 2018 в 16:36
поделиться

2 ответа

Имейте в виду, что Asyncio предназначен для запуска в одном потоке.

Если программе необходимо взаимодействовать с другими потоками, вам нужно будет использовать одну из выделенных функций:

Вот упрощенный пример:

async def run_with_non_asyncio_lib(action, arg):
    future = asyncio.Future()
    loop = asyncio.get_event_loop()

    def callback(*args):
        loop.call_soon_threasafe(future.set_result, args)

    non_asyncio_lib.register_callback(action, arg, callback)
    callback_args = await future
    return process(*callback_args)

Альтернативно, loop.run_in_executor предоставляет способ взаимодействия с не-асинхронными библиотеками путем запуска данной функции в своем собственном потоке:

async def run_with_non_asyncio_lib(action, arg):
    loop = asyncio.get_event_loop()
    future = loop.run_in_executor(None, non_asyncio_lib.run, action, arg)
    result = await future
    return result
0
ответ дан Vincent 17 August 2018 в 12:26
поделиться

С идеей Винсента,

я действительно нашел решение для своей проблемы:

def _generate_action_executor(action):
    async def run_action(goal):
        loop = asyncio.get_event_loop()
        action_done = loop.create_future()

        def done_callback(goal_status, result, future, loop):
            status = ActionLibGoalStatus(goal_status)
            print('Action Done: {}'.format(status))
            loop.call_soon_threadsafe(future.set_result(result))

        action.send_goal(goal,partial(done_callback, future=action_done, loop=loop))
        try:
            await action_done
        except asyncio.CancelledError as exc:
            action.cancel()
            raise exc

        return action_done.result()

    return run_action

Если кто-то знает, как реализовать его умнее, пожалуйста, поделитесь этим знанием с использованием.

Best Manuel

0
ответ дан user3851038 17 August 2018 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: