おじさん忙しくてなかなかブログを更新できませんでした。
久々の更新。
車の自動運転のソースコード公開されたんだ
http://gigazine.net/news/20161206-commaai-open-source/
ソースコードでも見てみようかなぁ、
https://github.com/commaai
という軽い気持ちでソースコードを眺めていたら、自動運転ライブラリはZMQというライブラリを介していろんなモジュールが通信していました。
ZMQってなんなんでしょうね?
ということで今日はZMQについて勉強してみました。
ZMQとはどうやら0MQ(ZeroMessageQueue)の略らしいです。
http://zeromq.org/
どうやらIPC、RPCなどプロセス間通信とか分散処理をするライブラリみたいですね。
最近ではこのようなライブラリをつかってPythonとC++などの言語間のブリッジやWindowsとAndroid間など異なるプラットフォーム間の通信を行うんですね。
たしかに、こうすればあらゆるプラットフォームのあらゆる言語で開発できるし、C++のPythonラッパーを作るより便利だよね。
ディープラーニングとか機械学習はPythonで書かれたり、C++で書かれたりしているのでこのようなライブラリを使うんですね。
この辺日本人がなかなか理解できない苦手なところだよね。
全然使い方とか解説のブログないじゃんと思っていたら、ZMQガイドブックの翻訳版がありました。
http://www.cuspy.org/diary/2015-05-07-zmq/
ということで、ZMQのサーバとクライアントを作ってみました。
このライブラリ、軽量でかつ簡単に分散処理とか異なる言語間通信できるので、本当に面白いですね。
------------------------------------------------
// Hello World サーバー
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main (void)
{
// クライアントと通信を行うソケット
void *context = zmq_ctx_new ();
void *responder = zmq_socket (context, ZMQ_REP);
int rc = zmq_bind (responder, "tcp://*:5555");
assert (rc == 0);
while (1) {
char buffer [10];
zmq_recv (responder, buffer, 10, 0);
printf ("Received Hello\n");
sleep (1); // 何らかの処理
zmq_send (responder, "World", 5, 0);
}
return 0;
}
------------------------------------------------
------------------------------------------------
// Hello World クライアント
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
int main (void)
{
printf ("Connecting to hello world server...\n");
void *context = zmq_ctx_new ();
void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");
int request_nbr;
for (request_nbr = 0; request_nbr != 10; request_nbr++)
{
char buffer [10];
printf ("Sending Hello %d...\n", request_nbr);
zmq_send (requester, "Hello", 5, 0);
zmq_recv (requester, buffer, 10, 0);
printf ("Received World %d\n", request_nbr);
}
zmq_close (requester);
zmq_ctx_destroy (context);
return 0;
}
------------------------------------------------
0 件のコメント:
コメントを投稿