源码地址
pip install grpcio
# 或者
pip install grpcio
# 在 El Capitan OSX 系统下可能会看到以下报错
$ OSError: [Errno 1] Operation not permitted: '/tmp/pip-qwTLbI-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'
# 可以使用以下命令
python -m pip install grpcio --ignore-installed
Python gPRC tools 包含 protocol buffer 编译器和用于从 .proto 文件生成服务端和客户端代码的插件
pip install grpcio-tools
// 文件名 hello.proto
//指定编译时用proto3来进行编译
syntax = "proto3";
//这个hello就是编译后文件xxx_pb2.py,xxx_hello_pb2_grpc.py;xxx也就是此处的hello
package hello;
// The greeting service definition.
service Greeter {
// Sends a greeting
//这里的SayHello可以理解为后面我们的服务端要重写的函数,也就是我们所谓的远程调用的接口
//最后客户端来调用这个接口
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
用python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./hello.proto来进行编译
生成了两个文件:
hello_pb2.py 此文件包含生成的 request(HelloRequest) 和 response(HelloReply) 类。
hello_pb2_grpc.py 此文件包含生成的 客户端(GreeterStub)和服务端(GreeterServicer)的类。
当用protocol buffer编译器来运行.proto文件时,编译器将生成所选择语言的代码,这些代码可以操作在.proto文件中定义的消息类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。
import time
from concurrent import futures
import grpc
import hello_pb2
import hello_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 12
class Greeter(hello_pb2_grpc.GreeterServicer):
# 实现GreeterServicer中的远程接口
def SayHello(self, request, context):
return hello_pb2.HelloReply(message='Hello abc, %s!' % request.name)
def serve():
# gRPC 服务器
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
# 指定通信端口
server.add_insecure_port('[::]:50051')
server.start() # start()开启服务端,等待客户端来调用 不会阻塞,如果运行时你的代码没有其它的事情可做,你可能需要循环等待。
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
from __future__ import print_function
import grpc
import hello_pb2
import hello_pb2_grpc
def run():
channel = grpc.insecure_channel('localhost:50051')
#调用客户端类
stub = hello_pb2_grpc.GreeterStub(channel)
# 调用远程接口
response = stub.SayHello(hello_pb2.HelloRequest(name='goodspeed'))
print("Greeter client received: " + response.message)
if __name__ == '__main__':
run()