grpc流式传输示例(c++)
生活随笔
收集整理的這篇文章主要介紹了
grpc流式传输示例(c++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
grpc理解
流式傳輸方式
Attention
grpc理解
grpc是結合protobuf的遠程調用框架,服務端和客戶端均支持同步和異步模式。同步模式下,服務器的service函數會阻塞,且當前線程不能再服務其它的client,類似于多線程模式,一個線程服務一個client,可通過ResourceQuota設置最大線程數;異步模式下,grpc提供類似poll方式管理事件,用戶注冊事件,并接收通知,一個線程管理一個CompletionQueue,通過輪詢管理clients,線程模型可以用戶自定義,在追求性能的情況下官方推薦異步模式。
grpc::ResourceQuota resource_quata; resource_quata.SetMaxThreads(2); builder.SetResourceQuota(resource_quata);流式傳輸方式
grpc自定義的service函數可以定義流式的參數和返回值,對應的函數實現通過Reader,Writer,ReaderWriter實現用戶自定義的邏輯,從而減少內存的使用,同時在部分數據到來時就可以進行數據處理。
proto文件
syntax="proto3"; package support;service SupportGenerator{rpc GenSupport(stream STL) returns( stream STL){} }message Point{float x=1;float y=2;float z=3; }message STL { repeated Point points=1; }服務端的代碼如下
#pragma once #include<memory> #include<grpc++/grpc++.h> #include"support.grpc.pb.h" #include"support.pb.h"//server impl class SupportGeneratorService final :public support::SupportGenerator::Service { public://importantgrpc::Status GenSupport(grpc::ServerContext* context, grpc::ServerReaderWriter<support::STL, support::STL>* stl_reader_writer) override{vector<support::STL> stls_; //recvvector<support::Point> vertics_;//recvvector<float> coordinates_;//recvsupport::STL stl;//sendwhile (stl_reader_writer->Read(&stl)){google::protobuf::RepeatedPtrField<support::Point> points = stl.points();CoutInLine("recieved from client ", points.size());stls_.emplace_back(stl); for (auto& point : points){vertics_.push_back(point); coordinates_.push_back(point.x());coordinates_.push_back(point.y());coordinates_.push_back(point.z());}} //return the request stl//for (auto stl_recieved : stls_)//{// stl_reader_writer->Write(stl_recieved);//} //return grpc::Status::OK;//handle #pragma region handle request#pragma endregionauto support_vertics = what you return ;int once_count = 100;int loop_count = support_vertics.size() / once_count + 1;int index = 0;for (int loop = 0; loop < loop_count; loop++){support::STL stl;for (int j = 0; j < once_count && index < support_vertics.size(); j++){auto vertic = support_vertics[index++];auto point = stl.add_points();point->set_x(vertic.x);point->set_y(vertic.y);point->set_z(vertic.z);}stl_reader_writer->Write(stl);}return grpc::Status::OK;} };class HServer { public:HServer(){ grpc::ServerBuilder builder;builder.AddListeningPort("0.0.0.0:5000", grpc::InsecureServerCredentials());builder.RegisterService(&support_generator_service_);//對于同步server 的資源管理grpc::ResourceQuota resource_quata;resource_quata.SetMaxThreads(2);builder.SetResourceQuota(resource_quata);server_ = builder.BuildAndStart();}~HServer(){Stop();}void RunBackground();void Stop();private:unique_ptr<grpc::Server> server_; SupportGeneratorService support_generator_service_; };客戶端代碼
std::shared_ptr<grpc::Channel> channel = grpc::CreateChannel("127.0.0.1:5000", grpc::InsecureChannelCredentials());std::unique_ptr<support::SupportGenerator::Stub> stub = support::SupportGenerator::NewStub(channel);while (true){getchar();grpc::ClientContext client_context;std::shared_ptr<grpc::ClientReaderWriter<support::STL, support::STL>> client_reader_writer(stub->GenSupport(&client_context));//recievedstd::vector<support::Point> points;//read stlint n_vertics = vertics.size();int once_count = 100;int loop_count = n_vertics / once_count + 1;int index = 0;for (int loop = 0; loop < loop_count; loop++){auto vertics = ReadStl("");//vertics should be read once_count every time in loopsupport::STL stl;for (int i = 0; i < once_count && index<n_vertics; i++){auto point = stl.add_points();point->set_x(vertics[index].x());point->set_y(vertics[index].y());point->set_z(vertics[index].z());index++;}client_reader_writer->Write(stl);std::cout << "client write stl " << loop <<" "<<index<< std::endl;}client_reader_writer->WritesDone();std::cout << "write done " <<index<< std::endl;support::STL stl;while (client_reader_writer->Read(&stl)){auto points_once = stl.points();for (auto& point : points_once){points.emplace_back(point);//get all data in memory}Save("", points_once);//save by many times can reduce memory usagestd::cout << "recieved from server " <<points_once.size()<< std::endl;}std::cout << "recieved done " << points.size() << std::endl;Attention
protobuf 二進制序列化和反序列化需要protoc可執行文件產生序列化對象的相關代碼;與grpc結合需要grpc自帶的對應編程語言的插件產生服務基類的相關代碼,二者版本需要相容。直接通過grpc安裝protobuf。
總結
以上是生活随笔為你收集整理的grpc流式传输示例(c++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金山快盘 linux,WPS移动版5.5
- 下一篇: android 抽屉新热榜 splash