Python学習【365日チャレンジ!】329日目のマスターU(@Udemy11)です。
そろそろ通常運転の状態に戻さないといけないな〜と思いながら、初詣に行ってきました。
流石に5日ともなると、どの神社もガラガラの状態で、安心してお参りすることができました。
正月三が日の人出は少なかったとはいえ、今日に比べるとコミコミの状態だったと思いますが、きちんと自粛した方が多い一方、例年と変わらない年末年始を過ごした人も多いんでしょうね。
緊急事態宣言を出すとか出さないとかいう話が出ていますが、1週間後には確実に感染者の数が増えているんでしょうね。
それでは今日も、Python学習を始めましょう。
昨日の復習
昨日は、キューイングシステムについて学習しました。
キューにジョブを預けることでシステムの負荷を考えてジョブを割り振ることができるのがキューイングシステムで、ブローカーなしとブローカありがあって、それぞれにメリット・デメリットがあることを学習しました。
くわしくは、昨日の記事をごらんください。
今日は、ブローカーなしキューイングシステムのZeroMQのPUSHとPULLの使い方について学習します。
ZeroMQのインストール
まずはpip
でZeroMQ
をインストールします。
pip install pyzmq
ターミナルから上記コマンドでZeroMQ
をインストールしたら、サーバー、クライアントのコードを書いていきます。
server.py
サーバー側でクライアントの要求を受けて値を返すコードを書いていきます。
import time
import zmq
context = zmq.Context()
sock = context.socket(zmq.PUSH)
sock.bind("tcp://127.0.0.1:5555")
id = 0
while True:
id += 1
sock.send(str(id).encode())
print("Sent: {}".format(id))
time.sleep(1)
必要なライブラリをインポートしたあと、context
というオブジェクトを作ります。
次に、zmq
のPUSH
であるsocket
オブジェクトをsock
として作成します。
6行目でTCPでIPアドレスとポート番号を指定して、ソケットをバインドします。
8行目でid
を0
にして、while
ループで回して1
を足して、ソケットでid
をsend
した状態にして、クライアントがPULL
で取りに来たら、print
出力でSent:ID
を出力して、最終行のsleep
で1秒待ってループを繰り返します。
client.py
クライアント側は、サーバーと同じように、コンテキストを作成して、zmq
は、PULL
でサーバー側からメッセージを受け取りに行きます。
import zmq
context = zmq.Context()
sock = context.socket(zmq.PULL)
sock.connect("tcp://127.0.0.1:5555")
while True:
message = sock.recv()
print("Received: {}".format(message.decode()))
3行目までは、time
のインポートがないだけで、サーバー側と同じですね。
4行目は、PUSH
ではなく、PULL
にして、5行目はbind
ではなく、connect
にしています。
7行目からはwhile
ループで、socket
に入っているid
を取得してmessage
に入れて、9行目でprint
出力でReceived:ID
と出力します。
実行動画
サーバーとクライアントのやり取りなので、動画にしてみました。
クライアントが一つのときは、1秒毎にIDを取得して1づつ数字が増えていきますが、クライアントが2つになると、順番に値を取得していくので、クライアントが取得するIDは、1つ飛ばしの番号になっていますが、サーバー側が用意しているのは続き番号になっています。
まとめ
socket通信については、下記の記事で学習しました。
このときのクライアントは、リクエストを送ってデータを取得するとプログラムが終了しましたが、今回の学習では、ずっと通信し続けるコードになっています。
サーバー側は、取得した値をいつでもクライアントに渡せる状態で、クライアント側からの要求にしたがって、データを渡せば次の値を用意しています。
具体的な使い所がどのような場面になるのかはまだわからないのですが、キューイングシステムを扱う場面が出てくればより深く学習しようと思います。
それでは、明日もGood Python!