【鸿蒙优选三方库】@ohos/grpc:像调本地方法一样调远程服务

该博客介绍鸿蒙生态三方库@ohos/grpc,基于HTTP/2与Protobuf实现Unary、Server Streaming、Client Streaming和Bidi Streaming四种原生流式RPC模式,支持强类型契约、编译期校验、连接池与多路复用,解决REST轮询高延迟、WebSocket无契约等问题,适配ArkTS开发,兼容Go/Java/Python标准gRPC服务端,显著降低流量与延迟。

【鸿蒙优选三方库】@ohos/grpc:像调本地方法一样调远程服务> REST 轮询延迟高又费流量,WebSocket 能推送却没有类型契约、字段对不上全靠口头约定。@ohos/grpc 基于 HTTP/2 + Protobuf:四种流式 RPC 模式原生支持,.proto 文件即接口契约,编译期就能发现字段错误。> 📦 仓库地址 | ohpm install @ohos/grpc | v1.0.15 | Apache-2.0—## 它解决什么问题需要和服务端高频通信的场景——实时行情、在线问诊、协同编辑、IoT 数据上报——用 REST 轮询总差口气:延迟最高一个轮询周期,流量浪费在重复请求上,长连接还得自己管。gRPC 是云原生时代的事实标准:HTTP/2 多路复用、Protobuf 二进制传输、四种流式模式。但它是 C/Go/Python 生态的东西,要在 ArkTS 里跑,得自己实现 HTTP/2 客户端栈、做 NAPI 桥接、处理流控。@ohos/grpc 分三层把这些封装好了:gRPC 客户端层(ArkTS) ← 四种 RPC 模式、credentials、MetadataHTTP/2 协议层(ArkTS) ← Session / Stream / 事件驱动Native 层(C++) ← nghttp2 + OpenSSL,通过 NAPI 上抛—## 核心能力| 能力 | 说明 ||------|------|| Unary RPC | 一问一答,等价于普通请求 || Server Streaming | 一次请求,服务端持续推 || Client Streaming | 客户端持续发,服务端最后响应 || Bidi Streaming | 双向同时收发 || HTTP/2 多路复用 | 单连接并发多请求 || Protobuf 契约 | 依赖 @ohos/protobufjs || 凭证与元数据 | credentials / Metadata / CallOptions |四种流模式的意义:聊天用双向流、行情推送用服务端流、日志上传用客户端流、普通查询用 Unary。REST 里这些都要各自造轮子。—## 30 秒上手bashohpm install @ohos/grpc安装后需把仓库的 protobufjs/index.d.ts 替换到 oh_modules/.ohpm/@ohos+protobufjs@2.1.0/oh_modules/@ohos/protobufjs/src/main/ets/index.d.ts,否则类型定义不全。Unary 调用:typescriptimport { grpc } from '@ohos/grpc'const client = new grpc.Client('https://grpc.example.com', { credentials: grpc.credentials.createInsecure(),})client.makeUnaryRequest( '/helloworld.Greeter/SayHello', (req) => req.serializeBinary(), (buf) => Reply.deserializeBinary(buf), Request.encode({ name: 'HarmonyOS' }).finish(), (err, res) => err ? console.error(err) : console.info(res.getMessage()),)双向流:typescriptconst call = client.makeBidiStreamRequest('/chat.Chat/Connect', ser, deser, metadata)call.on('data', (msg) => console.info('收到: ' + msg.getText()))call.on('end', () => console.info('流结束'))call.on('error', (err) => console.error(err))call.write(Message.encode({ text: '你好' }).finish()) // 随时发—## 社区已解决的典型问题并发请求导致闪退(#99 / #100 / #101)多个 gRPC 请求并发发起时崩溃,是反馈最集中的问题。已修复,并在 #102 提供了 pooled Unary 并发压测复现用例与 Demo。**上线前建议直接拿这个 Demo 压一轮。**池化模式下流数据发不连续(#95)启用连接池后,流式 RPC 的数据无法连续发送。已修复。流式 + 连接池的组合要重点测。内存泄漏(#97)更新测试 Demo 并优化了内存泄漏。长时间运行的流式连接(比如持续接收行情)要关注内存趋势。流结束的 END 数据处理(#94 / #96)补充了流式数据 END 验证 Demo 和监听事件维测 Demo。流关闭时要正确释放资源,否则连接会泄漏。—## 适合谁用- 实时行情 / 在线问诊 / 协同编辑:需要持续双向通信- IoT 网关:设备数据流式上报 + 指令下发- 服务端是 Go/Java/Python:标准 gRPC 直接对接,不用为鸿蒙单独开 REST 接口- 对延迟和流量敏感:HTTP/2 + Protobuf 比 HTTP/1.1 + JSON 常有数量级提升- 需要强类型契约:.proto 一改,两端编译期就报错93 个 Issue 已关闭,并发稳定性是社区打磨的重点。做生产级实时通信前,把 #102 的压测 Demo 跑一遍。

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值