python3 asyncio等待回调

时间:2018-07-13 16:00:00

标签: python-3.x asynchronous python-asyncio rospy

我试图弄清楚如何使用rospy actionlib和asyncio来 异步等待操作结果。为此,我尝试了 编写动作执行生成器,但现在还没有成功。 我的想法是在操作的ScrollViewer中添加一个异步的未来 但是未来似乎永远不会结束。

代码在这里:

done_callback

2 个答案:

答案 0 :(得分:0)

请记住,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

答案 1 :(得分:0)

有了Vincent的想法,

我实际上找到了解决问题的方法:

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

如果有人知道如何以更智能的方式实现它,请 分享使用中的知识。

最佳曼努埃尔