Einfacher gRPC in Python

Überblick

--Erstellen Sie einen einfachen gRPC-Prozess in Python. --Versuchen Sie, einen Prozess zu erstellen, der einen Wert anfordert und das Ergebnis wie REST zurückgibt.

Gesamtdurchfluss

  1. Installieren Sie grpcio-tools
  2. Erstellen Sie eine .proto-Datei und kompilieren Sie sie.
  3. Erstellen Sie Server- und Clientquellen mit der automatisch generierten Quelle.
  4. Testen

1. Installieren Sie grpcio-tools

Mit pip installieren


$ pip install grpcio-tools

2. Erstellen Sie eine Protodatei

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) {}
}

Erstellen Sie die folgende Quelle und führen Sie sie aus. (kompilieren) Simple_pb2.py und simple_pb2_grpc.py werden im selben Ordner erstellt.

codegen.py


from grpc.tools import protoc
protoc.main(
    (
        '',
        '-I.',
        '--python_out=.',
        '--grpc_python_out=.',
        'simple.proto',
    )
)

Lauf


$ python codegen.py

3. Quellenerstellung für Server und Client

Serverseite

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))
        #Übereinstimmung mit Antwort in der Protodatei
        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)

Client-Seite

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

Server starten


$ python server.py
run server

Client-Ausführung


$ python client.py
Reply:  Hello! Tom. Your message is Test

Process finished with exit code 0

Arbeitsordner (endgültiges Formular)

 C:\Users\grpc Verzeichnis

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

Bei Verwendung einer Liste oder eines Diktats

Wenn Sie den Wert der Liste zurückgeben möchten

.Proto-Datei


syntax = "proto3";

package simple;

// request
message SimpleRequest{
}

// response 
message SimpleResponse{
    repeated string msgs = 1;  //Verwenden Sie wiederholt
}

// interface
service SimpleService{
    rpc simple_send (SimpleRequest) returns (SimpleResponse) {}
}

Serverseite

Server, der eine Liste zurückgibt


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)  #Vergessen Sie nicht den Listennamen


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

Wenn Sie den Wert von dict zurückgeben möchten

.Proto-Datei


syntax = "proto3";

package simple;

// request
message SimpleRequest{
}

// response
message SimpleResponse{
    map<string, string> msg = 1; //Karte verwenden
}

// interface
service SimpleService{
    rpc simple_send (SimpleRequest) returns (SimpleResponse) {}
}

Server weggelassen

Referenz

Die folgenden Artikel waren sehr hilfreich. Es gibt eine detailliertere Beschreibung.

Recommended Posts

Einfacher gRPC in Python
Versuchen Sie gRPC in Python
Einfache Regressionsanalyse mit Python
Einfacher IRC-Client mit Python
Erste einfache Regressionsanalyse in Python
Einfaches OAuth 2 mit Python (urllib + oauthlib)
Implementierung eines einfachen Algorithmus in Python 2
Führen Sie einen einfachen Algorithmus in Python aus
Einfache Gacha-Logik in Python geschrieben
Quadtree in Python --2
Python in der Optimierung
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Ein einfacher HTTP-Client, der in Python implementiert ist
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Erstellen Sie eine einfache GUI-App in Python
Schreiben Sie eine einfache Giermethode in Python
Schreiben Sie ein einfaches Vim-Plugin in Python 3
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python