Имейте в виду, что 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
С идеей Винсента,
я действительно нашел решение для своей проблемы:
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