Kommunizieren Sie mit gRPC zwischen Elixir und Python

1. Zuallererst

Versuchen Sie die interlinguale Kommunikation zwischen Elixir und Python mit gRPC.

In diesem Artikel,

--gRPC-Server: Elixier --gRPC-Client: Python3

Es wird gesagt.

Ausführungsumgebung

hart Raspberry Pi 3B+
OS Raspbian Buster, Ubuntu Server 20.04LTS
Python 3.7.3
Elixir 1.7.4 (compiled with Erlang/OTP 21)

2. Elixierseite

Bereiten Sie sich zuerst auf die Elixierseite vor.

Hier das Beispiel "[examples / helloworld](https://github.com/elixir-grpc/", das in der [elixir-grpc-Bibliothek] enthalten ist (https://github.com/elixir-grpc/grpc) grpc / tree / master / examples / helloworld) ”.

Wenn der Client dem Namen einen Namen zuweist und eine Anfrage stellt, gibt der Server die Zeichenfolge "Hallo " zurück.

Befehlszeile


$ pwd
..../elixir/
#Klon
$ git clone https://github.com/elixir-grpc/grpc.git
#Gehen Sie zum Beispielverzeichnis
$ cd ./grpc/examples/helloworld/
#Abhängigkeitsbehandlung, Kompilieren.
$ mix do deps.get, compile

2. Python-Seite

Im Folgenden wird beschrieben, wie Sie einen Client-Server auf der Python-Seite erstellen.

(1) Installation des grpc-Tools

$ sudo apt install python3-grpcio python3-grpc-tools -y

(2) Schnittstellenerzeugung

Bereiten Sie ein Tool vor, das die Protodatei analysiert und eine Schnittstelle für Python generiert.

Befehlszeile


$ pwd
..../elixir/grpc/examples/helloworld
#Erstellen Sie einen Ordner zum Speichern von Python-Skripten
$ mkdir python
$ cd python
#Kopieren Sie die von elixir definierte Protodatei
python $ cp ../priv/protos/helloworld.proto ./
#Werkzeugdatei generieren
python $ touch codegen.py
python $ chmod 755 codegen.py

Quellcode für Tools, die Schnittstellen für Python generieren. Dieses Mal zielen wir auf helloworld.proto, also verwenden wir __NAME =" helloworld " im Code.

codegen.py


#!/usr/bin/env /usr/bin/python3
# -*- coding: utf-8 -*-
"""
Protodateien kompilieren

Die folgenden zwei Dateien werden generiert.
・*_pb2.py      :Schnittstelle serialisieren
・*_pb2_grpc.py :gRPC-Schnittstelle
"""
from grpc.tools import protoc

#Name der Protodatei (Namensteil)
__NAME="helloworld"

#Schnittstelle für Python generieren
protoc.main(
    (
        '',
        '-I.',
        '--python_out=.',
        '--grpc_python_out=.',
        ('{}.proto'.format(__NAME)),
    )
)

Erzeugt eine Schnittstelle für Python.

Befehlszeile


python $ ./codegen.py
python $ ls
codegen.py  helloworld_pb2_grpc.py  helloworld_pb2.py  helloworld.proto

Zwei Dateien, * _pb2.py und * _ pb2_grpc.py, wurden generiert.

(3) Erstellen eines Clients auf der Python-Seite

Erstellen Sie ein Client-Skript

Befehlszeile


#Datei generieren
python $ touch client.py
python $ chmod 755 client.py

client.py


#!/usr/bin/env /usr/bin/python3
# -*- coding: utf-8 -*-
"""
gRPC-Client
by myasu 2020 
"""

import sys
import grpc
#Importieren Sie die zuvor aus Proto generierte Schnittstelle
import helloworld_pb2
import helloworld_pb2_grpc


def grpc_client(request):
    """gRPC-Client-Kommunikationsverarbeitung
    Parameters
    ----------
    request : string
Nachricht, die an den gRPC-Server gesendet werden soll
    """
    #Stellen Sie eine Verbindung her, indem Sie die Adresse und den Port des gRPC-Servers auf der Elixir-Seite angeben
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        #Anfrage an den gRPC-Server auf der Elixir-Seite
        response = stub.SayHello(helloworld_pb2.HelloRequest(name=request))

    #Überprüfen Sie den Inhalt der Antwort
    print(' Response:', response.message)


if __name__ == '__main__':
    """Hauptverarbeitung
    """
    #Argumente lesen
    args = sys.argv
    #Überprüfen Sie die Länge des Arguments
    if len(args) == 2:
        #Lauf
        grpc_client(args[1])
    else:
        #Error
        print('Arguments are too short')

Kommunikationstest zwischen Python → Elixier → Python

Starten Sie zuerst die Server- / Elixierseite.

Terminal 1 / Elixir gRPC-Serverseite


$ mix grpc.server
10:58:01.872 [warn]  cowlib should be >= 2.9.0, it's 2.8.1 now. See grpc's README for details
10:58:01.977 [info]  Running Helloworld.Endpoint with Cowboy using http://0.0.0.0:50051

(... Ab hier wird es angezeigt, wenn eine Kundenanfrage vorliegt ...)
22:58:04.739 [info]  Handled by Helloworld.Greeter.Server.say_hello
22:58:04.744 [info]  Response :ok in 4ms
22:58:09.237 [info]  Handled by Helloworld.Greeter.Server.say_hello
22:58:09.237 [info]  Response :ok in 15μs
22:58:13.552 [info]  Handled by Helloworld.Greeter.Server.say_hello
22:58:13.552 [info]  Response :ok in 15μs
[Ctrl-\]Halte bei

Führen Sie als Nächstes die Client / Python-Seite aus. Jede Nachricht kann im Argument des Skripts angegeben werden.

Terminal 2-Python gRPC-Client-Seite


python $ ./client.py chika
 Response: Hello chika
python $ ./client.py you
 Response: Hello you
python $ ./client.py ruby
 Response: Hello ruby
python $ ./client.py CYaRon!
 Response: Hello CYaRon!

Der Server gibt die Nachricht am Anfang mit "Hallo" zurück. Mit diesem Gefühl war die Kommunikation zwischen verschiedenen Sprachen möglich.

4. Referenzmaterialien

Recommended Posts

Kommunizieren Sie mit gRPC zwischen Elixir und Python
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
GRPC beginnend mit Python
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Python mit Pyenv und Venv
Ich habe gRPC mit Python ausprobiert
Funktioniert mit Python und R.
Unterschied zwischen Ruby und Python Split
Leuchtendes Leben mit Python und OpenCV
Unterschied zwischen Java und Python (Memo)
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Unterschied zwischen list () und [] in Python
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Unterschied zwischen == und ist in Python
Scraping mit Node, Ruby und Python
Authentifizierungsprozess mit gRPC- und Firebase-Authentifizierung
Scraping mit Python, Selen und Chromedriver
Kratzen mit Python und schöner Suppe
Zusammenarbeit zwischen Python-Modul und API
JSON-Codierung und -Decodierung mit Python
Unterschied zwischen Python, Stftime und Strptime
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
Lesen und Schreiben von NetCDF mit Python
Ich habe mit PyQt5 und Python3 gespielt
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
[Python] Unterschied zwischen Funktion und Methode
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
Datenpipeline-Aufbau mit Python und Luigi
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Unterschied in der Authentizität zwischen Python und JavaScript
Überwachen Sie Mojo-Ausfälle mit Python und Skype
Unterschiede zwischen Ruby und Python im Umfang
FM-Modulation und Demodulation mit Python Part 3
[Automatisierung] Bearbeiten Sie Maus und Tastatur mit Python
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Passwortlose Authentifizierung mit RDS und IAM (Python)
Python-Installation und Paketverwaltung mit pip
Verwenden von Python und MeCab mit Azure Databricks
Unterschiede zwischen Python- und Java-Syntax
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
POST verschieden mit Python und empfange mit Flask
Bilder mit Pupil, Python und OpenCV aufnehmen
Unterschied zwischen @classmethod und @staticmethod in Python
Fraktal zum Erstellen und Spielen mit Python
Ein Memo mit Python2.7 und Python3 in CentOS
Versuchen wir es mit gRPC mit Go und Docker
Verwenden Sie PIL oder Pillow mit Cygwin Python