我试图弄清楚如何使用rospy actionlib和asyncio来
异步等待操作结果。为此,我尝试了
编写动作执行生成器,但现在还没有成功。
我的想法是在操作的ScrollViewer
中添加一个异步的未来
但是未来似乎永远不会结束。
代码在这里:
done_callback
答案 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
如果有人知道如何以更智能的方式实现它,请 分享使用中的知识。
最佳曼努埃尔