From a1538da39e41f937ad61e05c82251dc094861594 Mon Sep 17 00:00:00 2001 From: Junhan Chang Date: Wed, 13 Aug 2025 04:25:51 +0800 Subject: [PATCH] use call_async in all service to avoid deadlock --- unilabos/ros/nodes/base_device_node.py | 4 ++-- unilabos/ros/nodes/presets/host_node.py | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index 199cae88..76dd7649 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -336,7 +336,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): res.response = "" return res - def append_resource(req: SerialCommand_Request, res: SerialCommand_Response): + async def append_resource(req: SerialCommand_Request, res: SerialCommand_Response): # 物料传输到对应的node节点 rclient = self.create_client(ResourceAdd, "/resources/add") rclient.wait_for_service() @@ -399,7 +399,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): logger.info(f"更新物料{container_query_dict['name']}的数据{resource['data']} dict") else: logger.info(f"更新物料{container_query_dict['name']}出现不支持的数据类型{type(resource)} {resource}") - response = rclient.call(request) + response = await rclient.call_async(request) # 应该先add_resource了 res.response = "OK" # 如果driver自己就有assign的方法,那就使用driver自己的assign方法 diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 19e96743..5fe90684 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -351,7 +351,7 @@ class HostNode(BaseROS2DeviceNode): except Exception as e: self.lab_logger().error(f"[Host Node] Failed to create ActionClient for {action_id}: {str(e)}") - def create_resource_detailed( + async def create_resource_detailed( self, resources: list[Union[list["Resource"], "Resource"]], device_ids: list[str], @@ -393,11 +393,11 @@ class HostNode(BaseROS2DeviceNode): }, ensure_ascii=False, ) - response = sclient.call(request) + response = await sclient.call_async(request) responses.append(response) return responses - def create_resource( + async def create_resource( self, device_id: str, res_id: str, @@ -451,7 +451,9 @@ class HostNode(BaseROS2DeviceNode): ) ] - return self.create_resource_detailed(resources, device_ids, bind_parent_id, bind_location, other_calling_param) + response = await self.create_resource_detailed(resources, device_ids, bind_parent_id, bind_location, other_calling_param) + + return response def initialize_device(self, device_id: str, device_config: Dict[str, Any]) -> None: """