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.6 | 2016年12月23日 | 2021年12月 |
3.7 | 2018年6月27日 | 2023年6月 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年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の動作確認の説明でした。