2015-10-15 93 views
1

在我的Twisted应用程序中,我想发布消息到ZeroMQ消息队列。 我可以在Protocol类中做下面的事吗?从扭曲的客户端发布消息到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

@Jason:尝试它不会帮助!它似乎可以工作,但这是误导,因为“发送”呼叫被阻止。 –

回答

0

Socket.send方法的默认行为是阻塞,直到该消息已被排队的插座​​上。如果套接字队列已满,则在您的Twisted应用程序中没有其他事情会发生,直到套接字上有空间排队消息。

如果NOBLOCK标记不能对消息进行排队,则方法的标记将告诉zmq引发异常。但是,如果你这样做,那么你就不用担心失败:

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

这将简单使用txZMQ包,它ZMQ与扭曲事件循环集成。在documentationexamples建议你实现出版在txZMQ这样的:

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

itris在官方文档中运行代码,但不会输出空白屏幕 – anekix