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

File "socket.pyx", line 444, in zmq.backend.cython.socket.Socket.bind

(zmq/backend/cython/socket.c:4076)

File "checkrc.pxd", line 21, in zmq.backend.cython.checkrc._check_rc

(zmq/backend/cython/socket.c:6032)

zmq.error.ZMQError: Address already in use

Сообщения нужно отправлять как байтовые строки, поэтому в нашем примере

мы закодировали строки в формате UTF-8. Вы можете отправить любое количество

сообщений, если будете преобразовывать их в тип bytes. Мы использовали простые

текстовые строки как источник сообщений, поэтому методов encode() и decode()

будет достаточно, для того чтобы преобразовать их в байтовые строки и обратно.

Если ваши сообщения имеют другие типы данных, можете использовать библио-

теку вроде MessagePack (http://msgpack.org/).

Даже этот простой шаблон REQ — REP позволяет реализовать некоторые шаблоны

коммуникации, поскольку любое количество клиентов REQ может использовать

метод connect(), чтобы соединиться с единственным сервером REP. Сервер обраба-

тывает запросы синхронно по одному за раз, но не сбрасывает другие запросы,

ожидающие его внимания. ZeroMQ буферизует сообщения до определенного ли-

мита; именно из-за этого в его имени находится буква Q. Здесь Q расшифровывает-

ся как Queue — очередь, M — как Message — сообщение, а Zero (ноль) означает, что

ему не нужны посредники.

Несмотря на то что ZeroMQ не предоставляет никаких центральных брокеров

(промежуточных участников), вы можете создать их в любой момент. Например,

используйте сокеты DEALER и ROUTER, чтобы асинхронно подключиться к нескольким

источникам и/или конечным точкам.

Несколько сокетов REQ подключаются к одному сокету ROUTER, который пере-

дает каждый запрос сокету DEALER, который, в свою очередь, связывается с подклю-

ченным к нему сокетом REP (рис. 11.1). Это похоже на то, как несколько браузеров

связываются с прокси-сервером, расположенным перед фермой веб-серверов. Это

позволяет вам при необходимости добавить несколько клиентов и серверов.

Сокеты REQ соединяются только с сокетом ROUTER, сокет DEALER соединяется с не-

сколькими сокетами REP, лежащими позади него. ZeroMQ заботится о деталях,

гарантируя, что нагрузка, создаваемая запросами, сбалансирована и что ответы

будут возвращаться по правильному адресу.

Еще один сетевой шаблон называется «вентилятор», в его рамках используют-

ся сокеты PUSH — для того, чтобы перепоручать асинхронные задачи, и сокеты

PULL — для того, чтобы собирать результаты.

Последней значимой особенностью ZeroMQ является возможность масштаби-

роваться, просто изменив тип соединения с сокетом при его создании:

 tcp выполняет соединение между процессами на одной или нескольких машинах;

 ipc выполняет соединение между процессами на одной машине;

 inproc выполняет соединение между потоками одного процесса.

Сети

331

Рис. 11.1. Использование посредника для соединения с несколькими клиентами и серверами

Последнее соединение, inproc — это способ передать данные между потоками,

избежав блокировок, он является альтернативой примеру работы с потоками, по-

казанному в разделе «Потоки» данной главы.

После использования ZeroMQ вы, возможно, больше не захотите возвращаться

к написанию чистого кода для сокетов.

ZeroMQ определенно не единственная библиотека, отвечающая за передачу сообщений, кото-