Tout d'abord, installez gRPC. Il semble que les tampons de protocole, qui sont responsables de la sérialisation de RPC, seront installés avec gRPC.
$ curl -fsSL https://goo.gl/getgrpc | bash -s python
Si vous obtenez l'erreur suivante lors de l'installation, l'homebrew est obsolète et vous devriez essayer brew update
. (Pour Mac)
Error: undefined method `desc' for Grpc:Class
Please report this bug:
http://git.io/brew-troubleshooting
/usr/local/Library/Taps/grpc/homebrew-grpc/Formula/grpc.rb:2:in `<class:Grpc>'
・ ・ ・
Écrivez l'IDL pour les tampons de protocole. L'exemple suivant définit un RPC qui pilote le servo.
gRPC lui-même est un plugin pour les tampons de protocole. (Il existe de nombreuses implémentations RPC en plus de gRPC](https://github.com/google/protobuf/wiki/Third-Party-Add-ons#rpc-implementations))
gateway.proto
syntax = "proto3";
package gateway;
message MoveServoRequest {
int32 servo_id = 1;
int32 position = 2;
}
message MoveServoResponse {
int32 current_position = 1;
}
service AVRGateway {
rpc MoveServo (MoveServoRequest) returns (MoveServoResponse) {}
}
La commande suivante protoc
générera gateway_pb2.py
.
$ protoc --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_python_plugin` gateway.proto
Vous pouvez facilement écrire un serveur / client en important le script Python généré par la commande ci-dessus. Puisque la bibliothèque gRPC Python elle-même est toujours version Alpha, diverses méthodes sont préfixées avec early_adopter_ *.
gateway_server.py
import time
import gateway_pb2
class AVRGateway(gateway_pb2.EarlyAdopterAVRGatewayServicer):
def MoveServo(self, request, context):
print 'servo_id: %d, position: %d' % (request.servo_id, request.position)
return gateway_pb2.MoveServoResponse(current_position=150)
def serve():
server = gateway_pb2.early_adopter_create_AVRGateway_server(AVRGateway(), 9494, None, None)
server.start()
try:
while True:
time.sleep(100000)
except KeyboardInterrupt:
server.stop()
if __name__ == '__main__':
serve()
gateway_client.py
import gateway_pb2
def run():
with gateway_pb2.early_adopter_create_AVRGateway_stub('localhost', 9494) as stub:
response = stub.MoveServo(gateway_pb2.MoveServoRequest(servo_id=1, position=200), 10)
print "current position: " + str(response.current_position)
if __name__ == '__main__':
run()
Commencez par démarrer le serveur.
$ ls
gateway.proto gateway_client.py gateway_pb2.py gateway_server.py
$ python gateway_server.py
Et le client dans un autre terminal.
$ python gateway_client.py
current position: 150
D0729 10:42:14.835677000 140735135564544 iomgr.c:119] Waiting for 1 iomgr objects to be destroyed and executing final callbacks
Côté serveur
$ python gateway_server.py
servo_id: 1, position: 200
Si c'est sorti comme ça, c'est OK.
Recommended Posts