При использовании примеров helloworld я изменил основной цикл в greeter_async_client2.cc
, чтобы сделать 1 миллион итераций:
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
ошибки нет.Почему?Почему асинхронная версия не открывает слишком много файлов, в то время как синхронная?Возможно ли, чтобы синхронная версия действовала как асинхронная версия, или мне нужно использовать асинхронную версию, а затем использовать мьютекс для блокировки моей структуры данных при выполнении запроса?(Я бы хотел, чтобы мой сервер мог обрабатывать запросы в порядке их поступления, и каждый запрос будет изменять одну и ту же структуру данных, поэтому я использовал синхронный сервер. Однако, если асинхронный сервер может это делать, пожалуйста,я знаю).