Потоковое клиентское приложение gRPC вызывает ошибку сегментации на нескольких клиентах потока ⇐ Linux
Потоковое клиентское приложение gRPC вызывает ошибку сегментации на нескольких клиентах потока
У меня есть простая реализация службы gRPC:
сервис TestService { rpc stringService(Empty) возвращает (поток StringTest) {} rpc intService(Empty) возвращает (поток IntTest) {} } сообщение StringTest { строка my_string = 1; } сообщение IntTest { int32 my_int = 1; } сообщение пусто {} Идея состоит в том, чтобы просто непрерывно передавать клиенту целые числа и строки. Реализация сервера следующая:
class TestServiceImpl Final: public TestService::Service { публика: grpc::Status TestServiceImpl::stringService(grpc::ServerContext *context, const Empty *request, ::grpc::ServerWriter *writer) переопределить { данные StringTest; для (int я = 0; я Запись (данные); если (я == 10) я = 0; } вернуть grpc::Status::OK; } grpc::Status TestServiceImpl::intService(grpc::ServerContext *context, const Empty *request, ::grpc::ServerWriter *writer) переопределить { данные IntTest; для (int я = 10; я Запись (данные); если (я == 20) я = 10; } вернуть grpc::Status::OK; } }; интервал основной() { std::string addr("127.0.0.1:50051"); служба TestServiceImpl; grpc::ServerBuilder строитель; builder.AddListeningPort(addr, grpc::InsecureServerCredentials()); builder.RegisterService(&сервис); std::unique_ptr server(builder.BuildAndStart()); std::cout stringService(&context, request); // Кажется, здесь произошла ошибка StringTest stringMsg; while (reader->Read(&stringMsg)) { std::cout start(); } void IntThread::run() { автоматический канал = grpc::CreateChannel("127.0.0.1:50051", grpc::InsecureChannelCredentials()); ::grpc::Контекст ClientContext; ::Пустой запрос; m_stub = TestService::NewStub(канал); автоматическое чтение = m_stub->intService(&context, request); // Кажется, здесь произошла ошибка ИнтТест Интмсг; while (читатель->Чтение(&IntMsg)) { std::cout старт(); loader.setFileName("/путь/к/libIntClient.so"); загрузчик.загрузка(); abs = qobject_cast(loader.instance()); абс-> старт(); вернуть a.exec(); } Если я загружаю только один плагин, он работает безупречно и начинает получать и выводить строки/int из потока сервера gRPC. Проблема в том, что когда я загружаю оба плагина, при вызове службы всегда возникает ошибка сегментации. Если я наблюдаю за выводом сервера, то иногда другой поток достигает сервисной функции, но тут же аварийно завершает работу.
Итак, проблема в ошибке сегментации. Я понятия не имею, что могло стать причиной этого. Вероятно, это как-то связано с безопасностью потоков, но я не знаю, какой критический ресурс должен быть защищен от доступа. Мы будем очень признательны за любую информацию.
У меня есть простая реализация службы gRPC:
сервис TestService { rpc stringService(Empty) возвращает (поток StringTest) {} rpc intService(Empty) возвращает (поток IntTest) {} } сообщение StringTest { строка my_string = 1; } сообщение IntTest { int32 my_int = 1; } сообщение пусто {} Идея состоит в том, чтобы просто непрерывно передавать клиенту целые числа и строки. Реализация сервера следующая:
class TestServiceImpl Final: public TestService::Service { публика: grpc::Status TestServiceImpl::stringService(grpc::ServerContext *context, const Empty *request, ::grpc::ServerWriter *writer) переопределить { данные StringTest; для (int я = 0; я Запись (данные); если (я == 10) я = 0; } вернуть grpc::Status::OK; } grpc::Status TestServiceImpl::intService(grpc::ServerContext *context, const Empty *request, ::grpc::ServerWriter *writer) переопределить { данные IntTest; для (int я = 10; я Запись (данные); если (я == 20) я = 10; } вернуть grpc::Status::OK; } }; интервал основной() { std::string addr("127.0.0.1:50051"); служба TestServiceImpl; grpc::ServerBuilder строитель; builder.AddListeningPort(addr, grpc::InsecureServerCredentials()); builder.RegisterService(&сервис); std::unique_ptr server(builder.BuildAndStart()); std::cout stringService(&context, request); // Кажется, здесь произошла ошибка StringTest stringMsg; while (reader->Read(&stringMsg)) { std::cout start(); } void IntThread::run() { автоматический канал = grpc::CreateChannel("127.0.0.1:50051", grpc::InsecureChannelCredentials()); ::grpc::Контекст ClientContext; ::Пустой запрос; m_stub = TestService::NewStub(канал); автоматическое чтение = m_stub->intService(&context, request); // Кажется, здесь произошла ошибка ИнтТест Интмсг; while (читатель->Чтение(&IntMsg)) { std::cout старт(); loader.setFileName("/путь/к/libIntClient.so"); загрузчик.загрузка(); abs = qobject_cast(loader.instance()); абс-> старт(); вернуть a.exec(); } Если я загружаю только один плагин, он работает безупречно и начинает получать и выводить строки/int из потока сервера gRPC. Проблема в том, что когда я загружаю оба плагина, при вызове службы всегда возникает ошибка сегментации. Если я наблюдаю за выводом сервера, то иногда другой поток достигает сервисной функции, но тут же аварийно завершает работу.
Итак, проблема в ошибке сегментации. Я понятия не имею, что могло стать причиной этого. Вероятно, это как-то связано с безопасностью потоков, но я не знаю, какой критический ресурс должен быть защищен от доступа. Мы будем очень признательны за любую информацию.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Потоковое аудио из потока PyAudio для воспроизведения на веб-странице в Javascript
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-