2016-10-24 10 views
1

Я хочу ввести zmq на основе входа в программу Python. Когда я столкнулся с ошибками ZMQError: Address in use, я решил сварить это до простого доказательства концепции. Я смог запустить откидную версию, но не получать записи в журнале. Это код, который я использовал:Использование обработчика регистрации pyzmq в python

журнала Издательство:

import time 
import logging 
from zmq.log import handlers as zmqHandler 


logger = logging.getLogger('myapp') 
logger.setLevel(logging.ERROR) 
zmqH=zmqHandler.PUBHandler('tcp://127.0.0.1:12344') 
logger.addHandler(zmqH) 
for i in range(50): 
    logger.error('error test...') 
    print "Send error #%s" % (str(i)) 
    time.sleep(1) 

Результат

Send error #0 
Send error #1 
Send error #2 
Send error #3 
Send error #4 
... 

Вход Subscriber:

Результат

Listening to publishers... 

Таким образом, абонент заблокирован по вызову socket.recv(). Я начал издавать и подписываться в разных консолях. Оба процесса появляются, когда я использую netstat:

C:\>netstat -a -n -o | findstr 12344 
    TCP 127.0.0.1:12344  0.0.0.0:0    LISTEN   1336 
    TCP 127.0.0.1:12344  127.0.0.1:51937  ESTABLISHED  1336 
    TCP 127.0.0.1:51937  127.0.0.1:12344  ESTABLISHED  8624 

Я не вижу своей ошибки здесь, каких-либо идей?

В дополнение к проблеме, как использовать этот прослушиватель zmq в целом. Должен ли я создать один экземпляр PUBHandler для каждого процесса и затем добавить его ко всем экземплярам logger (logging.getLogger('myapp') создает собственный экземпляр журнала?) Или мне нужно создать собственный PUBHandler для всех классов, которые я использую ? Поскольку PUBHandler класса имеет createLock() Я предполагаю, что это не резьбу сохранить ...

Для Комплектности я хочу упомянуть doc of the PUBHandler class

Я использую питон (х, у) распределений на Win7 с Python 2.7 +0,10 и pyzmq 14.7.0-14

[обновление] я исключили окно брандмауэра в качестве источника недостающих пакетов

ответ

1

Проблема возникает на стороне абонента. Первоначально абонент фильтрует все сообщения, пока не будет установлен фильтр. Используйте функцию socket.setsockopt(opt, value) для ее архивирования. Описание pyZMQ не очень понятно, об использовании этой функции:

getsockopt (опция) GET опция сокета по умолчанию для новых сокетов, созданных этого контекста

Но документации из zmq_setsockopt функция вполне ясна (see here):

ИНТ zmq_s etsockopt (пустота * сокет, внутр имя_опция, сопзИте пустоту * OPTION_VALUE, size_t option_len)

...

ZMQ_SUBSCRIBE: Создание фильтра сообщений Параметр ZMQ_SUBSCRIBE должен установить новый фильтр сообщений на ZMQ_SUB розетки. Созданные недавно сокеты ZMQ_SUB должны отфильтровывать все входящие сообщения , поэтому вы должны позвонить по этому параметру, чтобы установить фильтр начального сообщения .

Таким образом, решение заключается в установке фильтра с socket.setsockopt(zmq.SUBSCRIBE,filter), где фильтр - это строка, которую вы хотите фильтровать. Используйте filter='', чтобы показать все сообщения. Фильтр, такой как filter='ERROR', будет отображать сообщения об ошибках и подавлять все другие типы, такие как WARNING, INFO или DEBUG.

При этом функции sub_client() выглядит следующим образом:

import time 
import zmq 

def sub_client(): 
    port = "12344"  
    context = zmq.Context() 
    socket = context.socket(zmq.SUB)  
    ssocket.connect("tcp://127.0.0.1:%s" % port) 
    socket.setsockopt(zmq.SUBSCRIBE,'') 


    # Process 30 updates 
    print "Listening to publishers..." 
    for i in range (30):  
     print "Listening to publishers..." 
     message = socket.recv() 
     print "Received error #%s: %s" % (str(i), message) 
     time.sleep(1) 

sub_client() 
0

Я думаю, вы пропустили установить PUB сокет сервера.

что-то вроде этого нужно сделать,

publisher = context.socket(zmq.PUB) 
publisher.bind('tcp://127.0.0.1:12344') 
zmqh = PUBHandler(publisher) 
logger = logging.getLogger('myapp') 
logger.setLevel(logging.ERROR) 
logger.addHandler(zmqh) 

Я надеюсь, что это помогает.

+0

@Akhay согласно документу, 'обработчик = PUBHandler ('InProc: // LOC')' должен быть эквивалентен seperatly создания сокета и привязок это к интерфейсу, но я дам ему попробовать –

+0

Я попробовал ваше предложение, но это ничего не изменило. Я все еще не получаю никаких журналов на стороне абонента. –