Python
python3
gRPC

gRPCでファイル転送ツール作成(python)

なぜgRPC??

gRPCの理解のため実際にツールを作ってみよう!ということで、gRPCを利用してファイル転送ツールを作ってみました。
言語はpythonです。
質問やアドバイスなどがあれば、コメントを頂けると幸いです。
なぜgRPCに興味を持ったかというと、Distributed Tensorflowでサーバー間通信に使われていて、
理解のためにとりあえず作ってみよーという感じです。
詳細はgRPCの公式を参照するといいです。
簡単に言うと、gRPCはHTTP2を利用して、様々なプラットフォーム間でリモートで関数を呼び出し、その出力を得ることができます。
また、インターフェースの言語に縛られないのも大きな特徴になっています。
構成としてはclientとserverに分かれていて、clientがRequestを送って、serverがResponseを返して通信を実現しています。
以下の図参照。

キャプチャ.PNG

gRPCのいいところは、

  • 対応インターフェースが多いところ(C++, python, golang, ruby, Java..)
  • clientとserver側で違うインターフェースでもOK
  • .protoでserveの定義を書けば各インターフェース向けのひな型を自動生成してくれる。
    • それをimportすれば基本的な実装を使える!!

pyuploader

作ったツールはここに上げました。
送信したいマシンのipアドレスを指定することでclientからserver側にファイル転送をすることができます。
linux-Windows間,Windows-Windows間のファイル転送などに使えるかなと思います。
自分はWindowsからlinuxにアクセスして作業してるのですが、linuxからWindowsにファイルを持ってくるのって結構めんどくさいのでこのツール使っています。
Windows起動時にpython uploader.py -s でserverを常時起動しておいて、いつでもlinuxからファイル転送できるようにしています。
ファイル送る時はこんな感じです。(とりあえず送ったファイル全部表示させてます。)
howto.gif

実装

Python Quickstartを参考にして作りました。
他の言語のガイドも載っています。
Python Quickstartを見るとわかると思いますが、protoをから以下のようにするとひな型を自動生成してくれます

$ python -m grpc_tools.protoc --python_out=. --grpc_python_out=. helloworld.proto

自分が作ったツールのupload_pb2.py,upload_pb2_grpc.pyは自動生成されたファイルです。

gRPCの1Requestで送れる通信容量には制限があるので、大きなファイルを転送するのには向きません。
なので今回は、下記のようにStreaming方式でファイル転送を行っています(ファイルを分割して複数回に分けて通信しています。)

upload.proto
syntax = 'proto3';

service Upload {
    rpc Fileup(stream Tdata) returns (stream Tdata) {}
}

message Tdata {
    string data = 1;
    int64 size = 2;
    string name = 3;
}