yyzybb537 / libgo

Go-style concurrency in C++11
MIT License
3.22k stars 758 forks source link

怎么check io异步效果 #164

Open chinesejie opened 5 years ago

chinesejie commented 5 years ago

代码这么写: 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了

yyzybb537 commented 5 years ago

验证方法: 1.使用单线程调度 2.上述代码写两遍(创建两个协程) 3.rpc调用的前后都打印日志

yyzybb537 commented 5 years ago

如果让出cpu,日志输出应该是AABB, 否则应该是ABAB

chinesejie commented 5 years ago

用了libgo的 channel来调度dag的实现,如下图:

       A
     /    \
   B1    B2

B1、B2是同一个rpc代码,rpc 之前打印1,之后打印2

结果是1212,也就是没有让出cpu。 哎,心酸。

yyzybb537 commented 5 years ago

这个要看你用的rpc的同步接口是怎么实现的了,如果是用网络io阻塞线程的,是可以让出cpu的,如果用其他手段阻塞等待的,就不行了

chinesejie commented 5 years ago

io的client 是brpc库的, 会不会是brpc的bthread 导致的 ?

yyzybb537 commented 5 years ago

brpc库我没有阅读过源码,不太清楚。 不过这种场景下也有其他解决方案:

co_chan < response > ch; rpc_stub.async_call(xxxxx, [=]( response rsp ) { ch << rsp; }); response rsp; ch >> rsp;

chinesejie commented 5 years ago

高赞,提供了一个好思路,我可以把brpc的代码改成异步回调,然后主线程挂起让出cpu,等回调数据回来了再 搞到channel里面