Skip to main content
 首页 » 编程设计

python之Python Twisted Push Producer 不规则传输问题

2025年05月04日11虾米姐

我想使用 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)。

对于这种特殊情况,这可能意味着无论何时您要将某些东西放入该队列 - 停止:检查生产者是否未暂停,如果没有,则将其写入消费者 相反。仅在生产者暂停时将项目放入队列。