Communiquez entre Elixir et Python avec gRPC

1.Tout d'abord

Essayez la communication interlinguale entre Elixir et Python en utilisant gRPC.

Dans cet article,

C'est dit.

Environnement d'exécution

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

2. Côté élixir

Tout d'abord, préparez-vous pour le côté Elixir.

Ici, l'exemple "[examples / helloworld](https://github.com/elixir-grpc/" inclus dans elixir-grpc library grpc / tree / master / examples / helloworld) ».

Lorsque le client attribue un nom au nom et fait une demande, le serveur renvoie la chaîne "Bonjour ".

Ligne de commande


$ pwd
..../elixir/
#Cloner
$ git clone https://github.com/elixir-grpc/grpc.git
#Accédez au répertoire des exemples
$ cd ./grpc/examples/helloworld/
#Gestion des dépendances, compilation.
$ mix do deps.get, compile

2. Côté Python

Voici la procédure de création d'un serveur client côté Python.

(1) Installation de l'outil grpc

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

(2) Génération d'interface

Préparez un outil qui analyse le fichier proto et génère une interface pour Python.

Ligne de commande


$ pwd
..../elixir/grpc/examples/helloworld
#Créer un dossier pour enregistrer les scripts Python
$ mkdir python
$ cd python
#Copiez le fichier proto défini par elixir
python $ cp ../priv/protos/helloworld.proto ./
#Générer un fichier outil
python $ touch codegen.py
python $ chmod 755 codegen.py

Code source pour les outils qui génèrent des interfaces pour Python. Cette fois, nous ciblons helloworld.proto, donc nous utilisons` __NAME =" helloworld "ʻ dans le code.

codegen.py


#!/usr/bin/env /usr/bin/python3
# -*- coding: utf-8 -*-
"""
Compilation de fichiers proto

Les deux fichiers suivants seront générés.
・*_pb2.py      :Sérialiser l'interface
・*_pb2_grpc.py :Interface gRPC
"""
from grpc.tools import protoc

#Nom du fichier Proto (partie du nom)
__NAME="helloworld"

#Générer une interface pour Python
protoc.main(
    (
        '',
        '-I.',
        '--python_out=.',
        '--grpc_python_out=.',
        ('{}.proto'.format(__NAME)),
    )
)

Génère une interface pour Python.

Ligne de commande


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

Deux fichiers, * _pb2.py et * _ pb2_grpc.py, ont été générés.

(3) Création d'un client côté Python

Créer un script client

Ligne de commande


#Générer un fichier
python $ touch client.py
python $ chmod 755 client.py

client.py


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

import sys
import grpc
#Importez l'interface générée à partir de proto plus tôt
import helloworld_pb2
import helloworld_pb2_grpc


def grpc_client(request):
    """Traitement de la communication client gRPC
    Parameters
    ----------
    request : string
Message à envoyer au serveur gRPC
    """
    #Connectez-vous en spécifiant l'adresse et le port du serveur gRPC côté Elixir
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        #Requête au serveur gRPC côté Elixir
        response = stub.SayHello(helloworld_pb2.HelloRequest(name=request))

    #Vérifiez le contenu de la réponse
    print(' Response:', response.message)


if __name__ == '__main__':
    """Traitement principal
    """
    #Lire les arguments
    args = sys.argv
    #Vérifiez la longueur de l'argument
    if len(args) == 2:
        #Courir
        grpc_client(args[1])
    else:
        #Erreur
        print('Arguments are too short')

Test de communication entre Python → Elixir → Python

Commencez par démarrer le côté serveur / Elixir.

Terminal 1 / côté serveur Elixir gRPC


$ 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

(... A partir de là, il sera affiché en cas de demande client ...)
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-\]Arrêté à

Ensuite, exécutez le côté client / Python. Tout message peut être spécifié dans l'argument du script.

Terminal 2-Python gRPC côté client


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!

Le serveur renverra le message avec "Bonjour" au début. Avec ce genre de sentiment, la communication entre différentes langues était possible.

4. Documents de référence

Recommended Posts

Communiquez entre Elixir et Python avec gRPC
Communiquez avec FX-5204PS avec Python et PyUSB
GRPC commençant par Python
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
python avec pyenv et venv
J'ai essayé gRPC avec Python
Fonctionne avec Python et R
Différence entre Ruby et Python Split
Briller la vie avec Python et OpenCV
Différence entre java et python (mémo)
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Différence entre list () et [] en Python
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Différence entre == et est en python
Scraping avec Node, Ruby et Python
Processus d'authentification avec gRPC et authentification Firebase
Grattage avec Python, Selenium et Chromedriver
Grattage avec Python et belle soupe
Coopération entre le module python et l'API
Encodage et décodage JSON avec python
Différence entre Python, stftime et strptime
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
Différence entre la série python2 et la série python3 dict.keys ()
Lire et écrire NetCDF avec Python
J'ai joué avec PyQt5 et Python3
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
[Python] Différence entre fonction et méthode
Coexistence de Python2 et 3 avec CircleCI (1.0)
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Construction de pipeline de données avec Python et Luigi
Calculer et afficher le poids standard avec python
Différence d'authenticité entre Python et JavaScript
Surveiller les pannes de Mojo avec Python et Skype
Différences entre Ruby et Python dans la portée
Modulation et démodulation FM avec Python Partie 3
[Automation] Manipulez la souris et le clavier avec Python
différence entre les instructions (instructions) et les expressions (expressions) en Python
Authentification sans mot de passe avec RDS et IAM (Python)
Installation de Python et gestion des packages avec pip
Utilisation de Python et MeCab avec Azure Databricks
Différences entre la syntaxe Python et Java
Différences dans la relation entre PHP et Python enfin et quitter
POSTER diversement avec Python et recevoir avec Flask
Capturer des images avec Pupil, python et OpenCV
Différence entre @classmethod et @staticmethod en Python
Fractal pour faire et jouer avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Essayons gRPC avec Go et Docker
Utilisez PIL ou Pillow avec Cygwin Python