日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

grpc流式传输示例(c++)

發布時間:2023/12/20 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。