reco.proto

syntax = "proto3";

package rpc_package;

service HelloWorldService {
rpc SayHello (HelloRequest) returns (HelloReply) {}
} message HelloRequest {
repeated Student student=1;
} message Student{
int32 age=1;
string name=2;
} message HelloReply {
string message = 1;
repeated int32 s_list=2;
}

  

 python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. reco.proto

创建出 reco_pb2.py 和 reco_pb2_grpc.py 两个文件

然后写服务端代码

test_grpc_server.py

from concurrent import futures
import grpc
import logging
import time from reco_pb2_grpc import add_HelloWorldServiceServicer_to_server, \
HelloWorldServiceServicer
from reco_pb2 import HelloRequest, HelloReply class Hello(HelloWorldServiceServicer): # 这里实现我们定义的接口
def SayHello(self, request, context):
s_list = [0,1,2,4,3]
return HelloReply(message='Hello, {}! '.format(request.student),s_list=s_list) def serve():
# 这里通过thread pool来并发处理server的任务
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) # 将对应的任务处理函数添加到rpc server中
add_HelloWorldServiceServicer_to_server(Hello(), server) # 这里使用的非安全接口,世界gRPC支持TLS/SSL安全连接,以及各种鉴权机制
server.add_insecure_port('[::]:50000')
server.start()
try:
while True:
time.sleep(60 * 60 * 24)
except KeyboardInterrupt:
server.stop(0) if __name__ == "__main__":
logging.basicConfig()
serve()

  

test_grpc_client.py

from __future__ import print_function
import logging import grpc
from reco_pb2 import HelloRequest, HelloReply
from reco_pb2_grpc import HelloWorldServiceStub def run():
# 使用with语法保证channel自动close
with grpc.insecure_channel('localhost:50000') as channel:
# 客户端通过stub来实现rpc通信
stub = HelloWorldServiceStub(channel) # 客户端必须使用定义好的类型,这里是HelloRequest类型
hellorequest = HelloRequest()
for i in range(5):
request = hellorequest.student.add()
request.age = 18
request.name = "xinyuuliu" response = stub.SayHello(hellorequest)
print ("hello client received: " + response.message)
print(response.s_list) if __name__ == "__main__":
logging.basicConfig()
run()

  

结果:

hello client received: Hello, [age: 18
name: "xinyuuliu"
, age: 18
name: "xinyuuliu"
, age: 18
name: "xinyuuliu"
, age: 18
name: "xinyuuliu"
, age: 18
name: "xinyuuliu"
]!
[0, 1, 2, 4, 3]

  

gRPC repeated数组的使用 python的更多相关文章

  1. 按固定元素数目分割数组- perl,python

    要求:把40个元素的数组,按每行8个,分5行打印出来.如下图 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 ...

  2. 打印数组所有排列 python

    本人.net一名,最近在看数据结构与算法分析,中间涉及的一些比较有意思的算法题,打算用python实现以下.选择python的原因,就是想熟悉一下python的语法,和pycharm基本的应用. 本篇 ...

  3. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  4. Python与数据结构[2] -> 队列/Queue[0] -> 数组队列的 Python 实现

    队列 / Queue 数组队列 数组队列是队列基于数组的一种实现,其实现类似于数组栈,是一种FIFO的线性数据结构. Queue: <--| 1 | 2 | 3 | 4 | 5 |<-- ...

  5. 合并2个数组为1个无重复元素的有序数组--Go对比Python

    Go实现: 1 package main 2 3 import ( 4 "fmt" 5 "sort" 6 ) 7 8 func main() { 9 var a ...

  6. Leetcode OJ : Repeated DNA Sequences hash python solution

    Total Accepted: 3790 Total Submissions: 21072     All DNA is composed of a series of nucleotides abb ...

  7. leetcode NO.349 两个数组的交集 (python实现)

    来源 https://leetcode-cn.com/problems/intersection-of-two-arrays/ 题目描述 给定两个数组,写一个函数来计算它们的交集. 例子: 给定 nu ...

  8. leetcode 238. 除自身以外数组的乘积 (python)

    给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1 ...

  9. 后缀数组【原理+python代码】

    后缀数组 参考:https://blog.csdn.net/a1035719430/article/details/80217267 https://blog.csdn.net/YxuanwKeith ...

  10. 剑指offer-字符串的排列-数组-递归-动态规划-python

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

随机推荐

  1. 最强本地缓存Caffeine

    Caffeine 是基于 JAVA 8 的高性能缓存库.并且在 spring5 (springboot 2.x) 后spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默 ...

  2. iview 动态表单验证 FormItem prop rules v-show 动态表单校验

    iview 动态表单验证 FormItem prop rules v-show 重点1 用v-show 控制显示隐藏 重点2 prop 指定字段 重点3 :rules 动态指定规则 <div v ...

  3. C++学习笔记之指针引用

    目录 指针 指针定义 左值与右值 指针数组与数组指针 const与指针 指针的指针 NULL指针 内存泄漏(Memory Leak)问题 智能指针 引用 指针 指针定义 指针定义的基本形式:指针本身就 ...

  4. Rust 标准库 Trait 指南

    部分内容来自 Rust 2021 年期刊 内容目录 引言 Trait 基础 自动 Trait 泛型 Trait 格式化 Trait 操作符 Trait 转换 Trait 错误处理 迭代器 Trait ...

  5. vue入门教程之-属性、事件和双向绑定

    vue入门教程之-属性.事件和双向绑定 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 htt ...

  6. 26_H.264编码实战

    目录 使用FFmpeg命令进行H.264编码 使用FFmpeg代码实现H.264编码 1.获取编码器 2.创建上下文 3.打开编码器 4.创建 AVFrame 5.创建 AVPacket 6.打开文件 ...

  7. 对角矩阵try

    \begin{bmatrix}1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\end{bmatrix}

  8. Python实现简易版TCP代理

    什么是TCP代理 TCP代理是一种网络代理技术,它允许客户端和服务器之间通过一个位于中间的第三方TCP代理服务器进行通信.TCP代理的工作方式是客户端向代理服务器发送TCP连接请求,代理服务器将此请求 ...

  9. 记录--极致舒适的Vue页面保活方案

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 为了让页面保活更加稳定,你们是怎么做的? 我用一行配置实现了 Vue页面保活是指在用户离开当前页面后,可以在返回时恢复上一次浏览页面的状态 ...

  10. Windows中控制台(cmd)模式下运行程序卡死/挂起现象解决方案(快速编辑模式)

    最近在运行编译好的exe文件时,发现了一个现象,就是通过cmd运行exe文件或者双击执行运行exe文件,偶尔会出现程序没有执行的情况.最开始发现这个现象时,还以为是程序出现了什么Bug.后面经过网上查 ...