sdbusplus:service通过协程完成proxy
创始人
2025-05-30 17:48:42

有的时候需要在service(记做s1)的method内访问其他service(记做s2)的method,如果s2的method需要较长的时间才能返回,那么通过普通的同步调用,会阻塞住s1,导致s1在此期间无法处理其他请求。那么可否在s1内用普通的异步的方式调用s2的method呢?由于普通的method是通过return返回调用结果的,当通过异步方式调用时,在s1的method的return时,是还没拿到返回值的(因为返回值是在异步调用的回调中获取的),所以也无法return。

这种情况可以使用协程的方式完成。

//sleep_service.cpp
#include 
#include 
#include 
#include 
#include 
#include 
#include using namespace std;string doSleep()
{cout<<"doSleep begin"<(io);conn->request_name("sleep.service");auto server = sdbusplus::asio::object_server(conn);shared_ptr iface = server.add_interface("/sleep_obj","sleep_infterface.data");iface->register_method("Sleep", doSleep);iface->initialize();io.run();return 0;
}

定义proxy service

//proxy_service.cpp
#include 
#include 
#include 
#include 
#include 
#include 
#include using namespace std;string doCallSleep(boost::asio::yield_context yield, shared_ptr conn)
{cout<<"1 proxy dosleep begin"<yield_method_call(yield, ec, "sleep.service", "/sleep_obj","sleep_infterface.data", "Sleep");if (ec){cout << "call Sleep failed: ec = " << ec << '\n';return "Sleep failed";}cout<<"1 proxy dosleep end"<yield_method_call(yield, ec, "sleep.service", "/sleep_obj","sleep_infterface.data", "Sleep");if (ec){cout << "call Sleep failed: ec = " << ec << '\n';return "Sleep failed";}cout<<"2 Sleep res="< conn, int d1, int d2)
{boost::system::error_code ec;int resAdd = conn->yield_method_call(yield, ec, "calculate.service", "/calculate_obj","calculate_infterface.data", "AddInt", d1, d2);if (ec){cout << "call addAddIntint failed: ec = " << ec << '\n';return -1;}cout<<"AddInt res="<(io);conn->request_name("proxy.service");auto server = sdbusplus::asio::object_server(conn);shared_ptr iface = server.add_interface("/proxy_obj","proxy_infterface.data");iface->register_method("CallSleep", [conn](boost::asio::yield_context yield) {return doCallSleep(yield, conn);});iface->register_method("CallAddInt", [conn](boost::asio::yield_context yield, int d1, int d2) {return doCallAddInt(yield, conn, d1, d2);});iface->initialize();io.run();return 0;
}

将sleep_service, calculate.service, proxy.service都加载起来,然后通过busctl进行测试:

在shell1里运行:
busctl call proxy.service /proxy_obj proxy_infterface.data CallSleep --user

在shell2里运行:
busctl call proxy.service /proxy_obj proxy_infterface.data CallAddInt ii 1 2 --user

可以看到proxy_service的输出:
1 proxy dosleep begin
AddInt res=3
1 proxy dosleep end
1 Sleep res=Sleep done
2 proxy dosleep begin
2 Sleep res=Sleep done
2proxy dosleep end

可以看出proxy_service可以同时响应多个请求,而不会把自己阻塞。

相关内容

热门资讯

UNIX网络编程_socket... 这篇笔记记录什么socket的认识。 1 什么是socket socket可以看成是用户进程与内核网...
centos yum安装英伟达... 背景 最近在研究一个AI项目,需要用到英伟达显卡训练模型,centos默...
易华录拟5亿元向电科投资转让国... 易华录(300212)今日公告,公司拟以非公开协议转让方式向中电科投资控股有限公司(以下简称“电科投...
兰德链金科技有限公司发布数字黄... 在数字金融持续演进、资产信任机制面临重构的背景下,兰德链金科技有限公司(RandChain Gold...
第四章 需求弹性和供给弹性分析 需求弹性 需求弹性:一种商品的需求量对其影响因素变动的反应敏感程度;通...
夏春:大国博弈正在深刻改变全球... 夏春 系上善资本首席经济学家、中国首席经济学家论坛理事5月23日,北京大学经济学院上海校友会、复旦大...
【id:11】【20分】D. ... 题目描述 输入一个2*3的矩阵,将这个矩阵向左旋转90度后输出 比如现在有2*3矩阵...
学习Docker?一篇足以 文章目录 Docker介绍Docker优缺点容器化DockerfileDocker常用命令Docke...
赵伟:财政“前置”后该关注什么... 赵伟 贾东旭 侯倩楠(赵伟系申万宏源证券首席经济学家、中国首席经济学家论坛理事)摘要财政债务融资和支...
股价连创新高,成都银行杭州银行... 出品|达摩财经5月30日,A股三大指数下跌,银行板块逆势上涨,除了招商银行、上海银行、兴业银行,其余...
芦哲:老龄化进程下的消费变迁和... 芦哲李昌萌(芦哲系东吴证券首席经济学家、中国首席经济学家论坛成员)核心观点我国人口老龄化进程有所加速...
云桌面技术哪家强?亲身体验后才... 一. 简介 作为一家领先的云计算服务提供商,华为云提供了丰富的云计算服务,...
第一章 信息化知识 1、信息是客观事物状态和运动特征的一种普遍形式,信息的概念存在两个基本的层次ÿ...
高数重点总结 高数 公式不要去死记 配合训练题在训练中记忆 完成一下这些题目 高中函数图像回忆 与其记忆各种公式不...
手动创建数据集(csv文件),... 文章目录基础知识创建多级目录多级路径拼接打开文件并对文件进行读写创建CSV数据集的简单例子 基础知识...
特朗普宣布将把进口钢铁关税提至... 每经编辑|张锦河 据央视新闻,当地时间5月31日,欧盟委员会在一份声明中对美国宣布提高进口钢铝关税...
17万字 JUC 看这一篇就够... 今天我们继续来学习Java并发编程 Juc框架 ,把剩余部分学习完 17万字 JUC...
Python(白银时代)——继... 单继承 面向对象的三大特性 封装 根据 职责 将属性和方法封装到一个抽象类中 继承 实现代码的重...
03 dubbo源码学习_服务... 1. 服务暴露1.1 服务本地暴露1.2 服务远程暴露1.2.1 导出服务1.2.1.1 开启net...
外贸网站seo产品越多越好吗?... 外贸网站seo产品越多越好吗? 答案:是的。 没有一个搜索引擎不喜欢大量...
centos7安装mysql5... 目录1.下载mysql5.7的rpm安装包2.上传mysql安装包到centos7的系统下3.安装依...
蓝桥杯算法基础_排它平方数_课... 题目 203879 * 203879 = 41566646641 这有什么神奇呢࿱...
Tomcat自定义的端口查不到... 昨天再维护一个老项目的时候遇到一个很奇葩的问题,服务正常启动,日志正常输...
CSC访学、博士后、联培选择国... 2023年国家留学基金委(CSC)公派出国项目申报即将开始。知识人网小编...
【C++】String模拟实现... 文章目录string的基本了解string类常用接口string类对象的常见构造string类对象的...
悉尼“原始”房产64年首次挂牌... 《悉尼晨锋报》5月31日报道,在周六的拍卖会上,一个来自悉尼内西区的家庭以 689万澳元的价格购入一...
瑞幸多款饮品降价3元 公司回应 瑞幸咖啡多款产品降价引起了消费者的关注。 据大象新闻报道,5月30日,有消费者下单时发现瑞幸咖啡迈入...
福田又多了一家上市公司! 近日 知名在线保险中介机构 手回集团 正式登陆港股市场 5月30日, 手回集团有限公司(简称“手回集...
雷军:小米汽车全国销售门店达2... 【CNMO科技消息】5月31日,小米公司主要创始人、董事长雷军宣布,小米汽车全国销售门店达298家。...
SpringCloud笔记(H... 配置中心:SpringCloud Config 应用服务除了实现系统功能,...