我想使用 Twisted 从队列传输数据。我目前使用推送生产者轮询队列中的项目并写入传输。
class Producer:
implements(interfaces.IPushProducer)
def __init__(self, protocol, queue):
self.queue = queue
self.protocol = protocol
def resumeProducing(self):
self.paused = False
while not self.paused:
try:
data = self.queue.get_nowait()
logger.debug("Transmitting: '%s'", repr(data))
data = cPickle.dumps(data)
self.protocol.transport.write(data + "\r\n")
except Empty:
pass
def pauseProducing(self):
logger.debug("Transmitter paused.")
self.paused = True
def stopProducing(self):
pass
问题是,数据发送非常不规律,如果队列中只有一个项目,则数据永远不会发送。好像Twisted是等到要传输的数据增长到一个特定的值,才会传输它。 我实现制作人的方式是否正确?我可以现在强制 Twisted 传输数据吗?
我也尝试过使用 pull 生产者,但 Twisted 根本不调用它的 resumeProducing() 方法。使用拉式生产者时,是否必须从外部调用 resumeProducer() 方法?
请您参考如下方法:
如果没有看到完整的示例(也就是说,也没有看到向消费者注册它的代码以及将项目放入该队列的代码),很难说为什么您的生产者不能正常工作。
但是,您可能会遇到的一个问题是,如果调用 resumeProducing 时您的队列为空,那么您将不会向消费者写入任何字节。当项目被放入队列时,它们将永远坐在那里,因为消费者不会再次调用您的 resumeProducing 方法。
这也适用于队列中没有足够数据导致消费者调用生产者的 pauseProducing 的任何其他情况。作为推送生产者,您的工作是继续自行生产数据,直到消费者调用 pauseProducing(或 stopProducing)。
对于这种特殊情况,这可能意味着无论何时您要将某些东西放入该队列 - 停止:检查生产者是否未暂停,如果没有,则将其写入消费者 相反。仅在生产者暂停时将项目放入队列。
