将消息从Twisted Client发布到ZeroMQ

时间:2015-10-15 09:46:19

标签: python twisted zeromq

在我的Twisted应用程序中,我想将消息发布到ZeroMQ消息队列。 我可以在Protocol类中执行类似下面的操作吗?

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)?

由于

1 个答案:

答案 0 :(得分:0)

Socket.send方法的默认行为是阻塞,直到消息在套接字上排队。如果套接字队列已满,那么在Twisted应用程序中不会发生任何其他事情,直到套接字上有空间对消息进行排队。

NOBLOCK方法的send标记告诉zmq如果无法对邮件进行排队,则会引发异常。但如果你这样做,那么你必须担心失败:

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

使用txZMQ包会更简单,它将ZMQ与Twisted事件循环集成在一起。 examples中的documentation建议您在txZMQ中实施发布,如下所示:

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