GRPC simple en Python

Aperçu

--Créez un processus gRPC simple en Python.

Flux global

  1. Installez grpcio-tools
  2. Créez un fichier .proto et compilez-le.
  3. Créez des sources serveur et client à l'aide de la source générée automatiquement.
  4. Test

1. Installez grpcio-tools

Installer avec pip


$ pip install grpcio-tools

2. Créez un fichier proto

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

3. Création de source pour le serveur et le client

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)

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)

4. Test

dé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

Dossier de travail (forme finale)

 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

Lors de l'utilisation d'une liste ou d'un dict

Si vous souhaitez renvoyer la valeur de la liste

.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)

Si vous souhaitez renvoyer la valeur de dict

.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

référence

Les articles suivants ont été très utiles. Il y a une description plus détaillée.

Recommended Posts

GRPC simple en Python
Essayez gRPC en Python
Analyse de régression simple avec Python
Client IRC simple avec python
Première analyse de régression simple en Python
OAuth 2 simple avec Python (urllib + oauthlib)
Implémentation d'un algorithme simple en Python 2
Exécutez un algorithme simple en Python
Logique gacha simple écrite en Python
Quadtree en Python --2
Python en optimisation
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Un client HTTP simple implémenté en Python
Essayez de dessiner une animation simple en Python
Créer une application GUI simple en Python
Ecrire une méthode de cupidité simple en Python
Ecrire un plugin Vim simple en Python 3
Liste triée en Python
AtCoder # 36 quotidien avec Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python