Essayez la communication interlinguale entre Elixir et Python en utilisant gRPC.
Dans cet article,
C'est dit.
dur | Raspberry Pi 3B+ |
OS | Raspbian Buster, Ubuntu Server 20.04LTS |
Python | 3.7.3 |
Elixir | 1.7.4 (compiled with Erlang/OTP 21) |
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
Voici la procédure de création d'un serveur client côté Python.
$ sudo apt install python3-grpcio python3-grpc-tools -y
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.
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')
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.
Recommended Posts