在使用helloworld示例时,我将greeter_async_client2.cc
中的主循环更改为进行100万次迭代:
for (int i = 0; i < 1000000; i++) {
std::string user("world " + std::to_string(i));
greeter.SayHello(user); // The actual RPC call!
}
然后我运行了greeter_server
,并对其进行了修改,greeter_async_client2
得到了以下错误:
Completion queue pluck failed: {"created":"@1568863204.491369000","description":"Too many open files","errno":24,"file":"src/core/lib/iomgr/wakeup_fd_pipe.cc","file_line":41,"os_error":"Too many open files","syscall":"pipe"}
但是使用greeter_async_server
时没有错误。为什么?为什么异步版本不会打开太多文件,而同步版本却打开太多文件?
同步版本是否有可能像异步版本一样工作,还是我必须先使用异步版本,然后在操作请求时使用互斥锁来锁定我的数据结构? (我希望我的服务器能够按接收顺序处理请求,并且每个请求都将修改相同的数据结构,这就是为什么我使用同步服务器。但是,如果异步服务器也可以这样做,请让我知道)。