Installieren Sie zuerst gRPC. Es scheint, dass Protokollpuffer, die für die Serialisierung von RPC verantwortlich sind, zusammen mit gRPC installiert werden.
$ curl -fsSL https://goo.gl/getgrpc | bash -s python
Wenn Sie während der Installation den folgenden Fehler erhalten, ist Homebrew veraltet und Sie sollten versuchen, das Update zu brauen. (Für 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>'
・ ・ ・
Schreiben Sie die IDL für Protokollpuffer. Das folgende Beispiel definiert einen RPC, der das Servo antreibt.
gRPC selbst ist ein Plugin für Protokollpuffer. (Neben gRPC gibt es viele RPC-Implementierungen](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) {}
}
Der folgende Befehl "protoc" generiert "gateway_pb2.py".
$ protoc --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_python_plugin` gateway.proto
Sie können einen Server / Client einfach schreiben, indem Sie das mit dem obigen Befehl generierte Python-Skript importieren. Da die gRPC-Python-Bibliothek selbst [noch Alpha-Version] ist (https://github.com/grpc/grpc/tree/master/src/python), wird verschiedenen Methoden Early_adopter_ * vorangestellt.
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()
Starten Sie zuerst den Server.
$ ls
gateway.proto gateway_client.py gateway_pb2.py gateway_server.py
$ python gateway_server.py
Und der Client in einem anderen 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
Auf der Serverseite
$ python gateway_server.py
servo_id: 1, position: 200
Wenn es so ausgegeben wird, ist es OK.
Recommended Posts