Онлайн-руководство (http://zguide.zeromq.org/) написано хорошим языком, в нем
представлено лучшее из виденных мной описаний сетевых шаблонов. Питером
Хинтдженсом (Pieter Hintjens) создана печатная версия ( ZeroMQ: Messaging for
Many Applications, O’Reilly), внутри которой хороший код, а на обложке — боль-
шая рыба (хорошо, что не наоборот). Все примеры в этом печатном руководстве
написаны на языке С, но онлайн-версия позволяет вам выбирать один из несколь-
ких языков для каждого примера. Можно даже выбрать примеры для Python
(http://bit.ly/zeromq-py). В этой главе я покажу вам базовые приемы работы с ZeroMQ
в Python.
ZeroMQ похож на конструктор Lego, и все мы знаем, что даже из небольшо-
го количества деталей можно построить удивительное множество вещей. В этом
328
Глава 11. Конкуренция и сети
случае вы будете создавать сети из сокетов нескольких типов и шаблонов. Основ-
ные «детальки Lego», представленные в следующем списке, являются типами со-
кетов ZeroMQ, которые из-за превратностей судьбы выглядят как шаблоны рабо-
ты в Сети, рассмотренные нами ранее:
REQ (синхронный запрос);
REP (синхронный ответ);
DEALER (асинхронный запрос);
ROUTER (асинхронный ответ);
PUB (публикация);
SUB (подписка);
PUSH (разветвление на выходе);
PULL (разветвление на входе).
Чтобы попробовать поработать с ними самостоятельно, вам нужно установить
библиотеку ZeroMQ, введя следующую команду:
$ pip install pyzmq
Простейший шаблон — это одна пара «запрос — ответ». Он является синхронным:
один сокет создает запрос, а затем другой сокет на него отвечает. Сначала рассмот-
рим код ответа (сервера) zmq_server.py:
import zmq
host = '127.0.0.1'
port = 6789
context = zmq.Context()
server = context.socket(zmq.REP)
server.bind("tcp://%s:%s" % (host, port))
while True:
# Ожидаем следующего запроса клиента
request_bytes = server.recv()
request_str = request_bytes.decode('utf-8')
print("That voice in my head says: %s" % request_str)
reply_str = "Stop saying: %s" % request_str
reply_bytes = bytes(reply_str, 'utf-8')
server.send(reply_bytes)
Мы создаем объект типа Context — это объект ZeroMQ, который обслуживает
состояние. Далее создаем сокет ZeroMQ, имеющий тип REP (получено от REPly —
ответ). Мы вызываем метод bind(), чтобы заставить его слушать определенный
IP-адрес и порт. Обратите внимание на то, что они указаны в строке, 'tcp://