PyZMQをインストールしてZeroMQを操作する【Python】

PyZMQをインストールしてZeroMQを操作する【Python】 プログラミング

ZeroMQをPythonから操作する手段は、PyZMQ一択です。

本記事の内容

  • PyZMQとは?
  • PyZMQのシステム要件
  • PyZMQのインストール
  • PyZMQの動作確認(入門)
  • PyZMQの動作確認(基本)

それでは、上記に沿って解説していきます。

PyZMQとは?

PyZMQとは、ZeroMQのPythonバインディングです。

ZeroMQは、C++で開発されています。
そのZeroMQをPythonから操作可能にしてくれるのが、PyZMQということです。

ZeroMQについては、次の記事で説明しています。

上記の記事では、ZeroMQのインストールについて紹介しています。
Ubuntuなどであれば、「apt」コマンドでZeroMQをインストールします。

しかし、PyZMQにはもれなくZeroMQがセットで付いてきます。
PyZMQをインストールすると、ZeroMQもインストールされるのです。

そのため、事前にZeroMQをインストールする必要はありません。
ただ、インストール済みでも問題はありません。
(実際に検証して、問題ありませんでした)

以上、PyZMQの説明でした。
次は、PyZMQのシステム要件を確認します。

PyZMQのシステム要件

現時点(2021年4月7日)でのPyZMQの最新バージョンは、22.0.3となります。
この最新バージョンは、2021年1月12日にリリースされています。

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

そして、サポート対象となるPythonのバージョンは以下。

  • Python 3.6
  • Python 3.7
  • Python 3.8
  • Python 3.9

これは素晴らしい状況と言えます。
なぜなら、Pythonの公式開発サイクルに準じているからです。

バージョンリリース日サポート期限
3.62016年12月23日2021年12月
3.72018年6月27日2023年6月
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月

あとは、サーバー側はもちろんZeroMQが必要です。
でも、すでに述べた通りPyZMQとセットでZeroMQはインストールされます。

この際にインストールされるZeroMQは、最新の安定版です。
バージョンは、4.3.4となります。

以上より、PyZMQのシステム要件は、Pythonのバージョンにさえ注意すればOKです。
次は、PyZMQをインストールしていきましょう。

PyZMQのインストール

最初に、現状のインストール済みパッケージを確認しておきます。

$ pip list
Package    Version
---------- -------
pip        21.0.1
setuptools 49.2.1

次にするべきことは、pip自体の更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip

では、PyZMQのインストールです。
PyZMQのインストールは、以下のコマンドとなります。

pip install pyzmq

インストールは、すぐに終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。

$ pip list
Package    Version
---------- -------
pip        21.0.1
pyzmq      22.0.3
setuptools 49.2.1

最新のPyZMQが、インストールされています。
依存関係のあるパッケージは、ありません。
その点では、PyZMQは容易に導入できるライブラリと言えます。

以上、PyZMQのインストールの説明でした。
次は、PyZMQの動作確認を行います。

PyZMQの動作確認(入門)

PyZMQの動作確認です。
と言うよりは、ZeroMQの動作確認と言ったほうが適切でしょうね。

公式サイトに載っている動作確認を行います。
まずは、二つのプログラムを用意します。

server.py

#
#   Hello World server in Python
#   Binds REP socket to tcp://*:5555
#   Expects b"Hello" from client, replies with b"World"
#

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print("Received request: %s" % message)

    #  Do some 'work'
    time.sleep(1)

    #  Send reply back to client
    socket.send(b"World")

client.py

#
#   Hello World client in Python
#   Connects REQ socket to tcp://localhost:5555
#   Sends "Hello" to server, expects "World" back
#

import zmq

context = zmq.Context()

#  Socket to talk to server
print("Connecting to hello world server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

#  Do 10 requests, waiting each time for a response
for request in range(10):
    print("Sending request %s …" % request)
    socket.send(b"Hello")

    #  Get the reply.
    message = socket.recv()
    print("Received reply %s [ %s ]" % (request, message))

次に、二つのターミナル(T1とT2と呼びます)を起動します。

先にT1でserver.pyを実行。

[T1]

$ python server.py

そのまま待ち状態になります。
そして、T2でclient.pyを実行。

[T2]

$ python client.py

上記を実行すると、それぞれのターミナルで文字列の表示が始まる。

T2で「Sending request」が表示

T1で「Received request」が表示

これが10回繰り返される。
その結果は以下。

[T1]

Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'
Received request: b'Hello'

[T2]

Connecting to hello world server…
Sending request 0 …
Received reply 0 [ b'World' ]
Sending request 1 …
Received reply 1 [ b'World' ]
Sending request 2 …
Received reply 2 [ b'World' ]
Sending request 3 …
Received reply 3 [ b'World' ]
Sending request 4 …
Received reply 4 [ b'World' ]
Sending request 5 …
Received reply 5 [ b'World' ]
Sending request 6 …
Received reply 6 [ b'World' ]
Sending request 7 …
Received reply 7 [ b'World' ]
Sending request 8 …
Received reply 8 [ b'World' ]
Sending request 9 …
Received reply 9 [ b'World' ]

ここまでの確認により、PyZMQの動作確認はOKです。
ただし、これは同一マシン上の話になります。

server.pyもclient.pyも同一マシン上にあるので、実際の運用とは異なります。
実際の運用は、それぞれ別々のマシン上にあるはずです。

その実際の運用に沿った動作確認も行っておきましょう。
以下で確認します。

PyZMQの動作確認(基本)

マシンを二つ(クライアントとサーバーと呼びます)用意します。
仮想OSでも何でもOKです。

仮想OSに関しては、次の記事で解説しています。

クライアントとサーバーともに、PyZMQをインストールしておきます。
まずは、サーバー上で上記のserver.pyを起動します。

サーバー

$ python server.py

次に、クライアント上でclient.pyを実行します。
ただし、以下の部分を変更する必要があります。

socket.connect("tcp://localhost:5555")

localhostではなく、サーバーのIPアドレスに変更します。
例えば、以下のような変更です。

socket.connect("tcp://192.168.33.20:5555")

変更してから、client.pyを実行します。

クライアント

>python client.py
Connecting to hello world server…
Sending request 0 …

この状態以降進まない場合は、サーバーのポートが開放されていない可能性が高いです。
ポートは「5555」を利用しています。

ポートの開放については、Ubuntuの場合は以下の記事が参考になります。

サーバー側のポートを開放したら、上手く動くはずです。
以上、PyZMQの動作確認の説明でした。

タイトルとURLをコピーしました