Python キューイングシステム

Python学習【365日チャレンジ!】329日目のマスターU(@Udemy11)です。

そろそろ通常運転の状態に戻さないといけないな〜と思いながら、初詣に行ってきました。

流石に5日ともなると、どの神社もガラガラの状態で、安心してお参りすることができました。

正月三が日の人出は少なかったとはいえ、今日に比べるとコミコミの状態だったと思いますが、きちんと自粛した方が多い一方、例年と変わらない年末年始を過ごした人も多いんでしょうね。

緊急事態宣言を出すとか出さないとかいう話が出ていますが、1週間後には確実に感染者の数が増えているんでしょうね。

それでは今日も、Python学習を始めましょう。

昨日の復習

昨日は、キューイングシステムについて学習しました。

キューにジョブを預けることでシステムの負荷を考えてジョブを割り振ることができるのがキューイングシステムで、ブローカーなしとブローカありがあって、それぞれにメリット・デメリットがあることを学習しました。

くわしくは、昨日の記事をごらんください。

今日は、ブローカーなしキューイングシステムのZeroMQのPUSHとPULLの使い方について学習します。

ZeroMQのインストール

まずはpipZeroMQをインストールします。

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というオブジェクトを作ります。

次に、zmqPUSHであるsocketオブジェクトをsockとして作成します。

6行目でTCPでIPアドレスとポート番号を指定して、ソケットをバインドします。

8行目でid0にして、whileループで回して1を足して、ソケットでidsendした状態にして、クライアントが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!