2015-10-15 3 views
1

В моем приложении Twisted я хочу публиковать сообщения в очереди сообщений ZeroMQ. Могу ли я сделать что-то вроде ниже в классе Protocol?Публикация сообщений от Twisted Client до ZeroMQ

from twisted.internet import protocol,reactor 
import zmq 

class MyClient(protocol.Protocol): 
    def __init__(self): 
    self.context = zmq.Context() 
    self.socket = context.socket(zmq.PUB) 
    self.socket.bind("tcp://127.0.0.1:5000") 

    def dataReceived(self,data): 
    #Do something with the data to get a result 
    #... 
    #Publish to 0mq 
    self.socket.send(result) 

#Code below for factory and initializing reactor 
#... 

reactor.run() 

Будет ли выше работа, если нет, то почему?. Если это не работает, следует использовать txZMQ (https://github.com/smira/txZMQ)?

Благодаря

+0

ли вы на самом деле пробовал еще? Что случилось? – Jason

+0

@ Джейсон: Попытка не поможет! Он будет работать, но это вводит в заблуждение, так как блокировка 'send' вызывает блокировку. –

ответ

0

поведение по умолчанию метода Socket.send является блокирование, пока сообщение не будет поставлен в очередь на сокете. Если очередь сокета заполнена, то ничего не произойдет в вашем приложении Twisted до тех пор, пока в сокете не будет очереди для очереди сообщения.

Флаг NOBLOCKsend указывает zmq, чтобы поднять исключение, если оно не может отправить сообщение в очередь. Но если вы сделаете это, то вам не придется беспокоиться о неудачах:

try: 
    self.socket.send(result, flags=zmq.NOBLOCK) 
except zmq.Again: 
    # Failed to queue the message: what now? 

Было бы проще использовать txZMQ пакет, который интегрирует ZMQ с рассеченным циклом событий. examples в documentation предполагают, что вы реализуете публикации в txZMQ так:

factory = ZmqFactory() 
publisher = ZmqPubConnection(factory, endpoint) 
publisher.publish(message) 
+0

Итрис запускает код в официальных документах, но ther is no ouput просто пустой экран – anekix