Open chinesejie opened 5 years ago
验证方法: 1.使用单线程调度 2.上述代码写两遍(创建两个协程) 3.rpc调用的前后都打印日志
如果让出cpu,日志输出应该是AABB, 否则应该是ABAB
用了libgo的 channel来调度dag的实现,如下图:
A
/ \
B1 B2
B1、B2是同一个rpc代码,rpc 之前打印1,之后打印2
结果是1212,也就是没有让出cpu。 哎,心酸。
这个要看你用的rpc的同步接口是怎么实现的了,如果是用网络io阻塞线程的,是可以让出cpu的,如果用其他手段阻塞等待的,就不行了
io的client 是brpc库的, 会不会是brpc的bthread 导致的 ?
brpc库我没有阅读过源码,不太清楚。 不过这种场景下也有其他解决方案:
co_chan < response > ch; rpc_stub.async_call(xxxxx, [=]( response rsp ) { ch << rsp; }); response rsp; ch >> rsp;
高赞,提供了一个好思路,我可以把brpc的代码改成异步回调,然后主线程挂起让出cpu,等回调数据回来了再 搞到channel里面
代码这么写: go [=] { // 100行代码 Request request; Response response; // 某段同步rpc代码 rpcstub.get(&request, &response); } 我前后用co::CoDebugger::getInstance().GetAllInfo().c_str();打印信息,只看到了100行是task的信息。
但是看不出 rpc_stub.get()这段代码是不是 让出cpu了呢?
我要怎么验证呢? 或者说,只要是rpc的io的肯定是让出了cpu了