Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 255

правители и получатели не синхронизированы.

Онлайн-руководство (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://