LoginSignup
8
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-14

なぜ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;
}
8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4