--Créez un processus gRPC simple en Python.
.proto
et compilez-le.Installer avec pip
$ pip install grpcio-tools
simple.proto
syntax = "proto3";
package simple;
// request
message SimpleRequest{
string name = 1;
string msg = 2;
}
// response
message SimpleResponse{
string reply_msg = 1;
}
// interface
service SimpleService{
rpc SimpleSend (SimpleRequest) returns (SimpleResponse) {}
}
Créez et exécutez la source suivante. (compiler)
Simple_pb2.py
et simple_pb2_grpc.py
sont créés dans le même dossier.
codegen.py
from grpc.tools import protoc
protoc.main(
(
'',
'-I.',
'--python_out=.',
'--grpc_python_out=.',
'simple.proto',
)
)
Courir
$ python codegen.py
Du côté serveur
server.py
import grpc
import time
import simple_pb2
import simple_pb2_grpc
from concurrent import futures
class SimpleServiceServicer(simple_pb2_grpc.SimpleServiceServicer):
def __init__(self):
pass
def SimpleSend(self, request, context):
print('logging: name {}, msg {}'.format(request.name, request.msg))
#Correspondance avec la réponse dans le fichier proto
return simple_pb2.SimpleResponse(
reply_msg = 'Hello! ' + request.name + '. Your message is ' + request.msg
)
# start server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
simple_pb2_grpc.add_SimpleServiceServicer_to_server(SimpleServiceServicer(), server)
server.add_insecure_port('[::]:5051')
server.start()
print('run server')
# wait
try:
while True:
time.sleep(3600)
except KeyboardInterrupt:
# stop server
server.stop(0)
SimpleResponse
est défini dans simple_pb2
, la réponse est renvoyée à partir de là.Côté client
client.py
import grpc
import simple_pb2
import simple_pb2_grpc
with grpc.insecure_channel('localhost:5051') as channel:
stub = simple_pb2_grpc.SimpleServiceStub(channel)
name = "Tom"
msg = "Test"
response = stub.SimpleSend(simple_pb2.SimpleRequest(name=name, msg=msg))
print('Reply: ', response.reply_msg)
SimpleRequest
prend le nom et le msg comme arguments. Image qui lui est transmise et génère une classeSimpleSend
de stub et lui passant la classe générée comme argument
--Output reply_msg inclus dans la réponsedémarrer le serveur
$ python server.py
run server
Exécution du client
$ python client.py
Reply: Hello! Tom. Your message is Test
Process finished with exit code 0
C:\Users\répertoire grpc
2020/01/21 17:47 <DIR> .
2020/01/21 17:47 <DIR> ..
2020/01/21 17:45 327 client.py
2020/01/21 14:31 173 codegen.py
2020/01/21 17:47 851 server.py
2020/01/21 17:43 300 simple.proto
2020/01/21 17:43 4,212 simple_pb2.py
2020/01/21 17:43 1,342 simple_pb2_grpc.py
.fichier proto
syntax = "proto3";
package simple;
// request
message SimpleRequest{
}
// response
message SimpleResponse{
repeated string msgs = 1; //Utiliser répété
}
// interface
service SimpleService{
rpc simple_send (SimpleRequest) returns (SimpleResponse) {}
}
Du côté serveur
Serveur qui renvoie une liste
import grpc
import time
import simple_iter_pb2
import simple_iter_pb2_grpc
from concurrent import futures
class SimpleServiceServicer(simple_iter_pb2_grpc.SimpleServiceServicer):
def __init__(self):
pass
def simple_send(self, request, context):
sample_data = ['message1', 'message2']
return simple_iter_pb2.SimpleResponse(msgs=sample_data) #N'oubliez pas le nom de la liste
# start server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
simple_iter_pb2_grpc.add_SimpleServiceServicer_to_server(SimpleServiceServicer(), server)
server.add_insecure_port('[::]:5051')
server.start()
print('run server')
# wait
try:
while True:
time.sleep(3600)
except KeyboardInterrupt:
# stop server
server.stop(0)
.fichier proto
syntax = "proto3";
package simple;
// request
message SimpleRequest{
}
// response
message SimpleResponse{
map<string, string> msg = 1; //Utiliser la carte
}
// interface
service SimpleService{
rpc simple_send (SimpleRequest) returns (SimpleResponse) {}
}
Serveur omis
Les articles suivants ont été très utiles. Il y a une description plus détaillée.
Recommended Posts