跳至主要內容

ZeroMQ-Python

Jia-Yin大约 1 分鐘coursecomm

這一節將使用 Python 及 ZeroMQ 來示範簡單的訊息傳遞,包括請求/回應(Request/Reply)以及發布/訂閱(Publish/Subscribe)模式的應用範例。

安裝 ZeroMQ for Python

在 Python 中使用 ZeroMQ 前,需要安裝 pyzmq 套件:

pip install pyzmq

基本請求/回應模式

服務端程式碼(Python)

import zmq

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

print("Waiting for clients ...")

while True:
    received_data = socket.recv_string()
    print(f"Received {received_data}")
    socket.send_string("World")

客戶端程式碼(Python)

import zmq

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

for request_nbr in range(1, 11):
    print(f"Sending Hello {request_nbr}...")
    socket.send_string("Hello")
    received = socket.recv_string()
    print(f"Received {request_nbr} = {received}")

基本發布/訂閱模式

服務端程式碼(Python)

import zmq
from random import randint

context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.bind("tcp://*:5556")

while True:
    dice_number = randint(1, 6)
    data = f"Dice {dice_number}"
    publisher.send_string(data)
    score = randint(1, 100)
    data = f"Score {score}"
    publisher.send_string(data)

客戶端程式碼(Python)

import zmq

context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.connect("tcp://localhost:5556")
msgfilter = "Dice"
subscriber.setsockopt_string(zmq.SUBSCRIBE, msgfilter)

total = 0
print("Receiving 100 dice numbers...")

for update_nbr in range(100):
    string = subscriber.recv_string()
    _, number = string.split()
    print(f"{number}", end=" ")
    total += int(number)

print(f"\n\nAverage = {total/100:.2f}")

以上的程式碼範例展示了如何在 Python 環境中使用 ZeroMQ 進行基本的「請求/回應」和「發布/訂閱」通信模式。

練習 2

  1. 在 Python 中實際操作以上的範例程式。
  2. 試著在不同電腦同時使用 Octave 及 Python 進行 ZeroMQ 之間的通訊。
  3. 目前將連線擴充到至少三台電腦的連線,連線模式可自訂。