我需要一个套接字对模式的队列吗?

Do I need a queue for a socket pair pattern?

我正在编写一个 Tornado 服务器,它允许以一种配对模式在套接字之间进行通信。这看起来像

def write_to_paired(self, message):
    if (paired == online):
        paired.write_message(message)

class typeASocket:
    def on_message(message):
        write_to_paired(message)

class typeBSocket:
    def on_message(message):
        write_to_paired(message)

这些连接只会是 1:1。我是否需要队列来使这种模式可扩展,或者仅在 N:1 生产者-消费者情况下才需要?例如 write_to_paired 会变成

def write_to_paired(self, message):
    if (paired == online):
        self.queue.push(message)
        self.ping(paired) # Tell the paired socket that there's a message available

这取决于 write_messageon_message 的定义方式。对于在 Tornado IOStream 之上实现的许多协议,包括 Tornado 的 WebSocketHandler,1:1 配对不需要队列,因为 IOStream.write 有一个内部 FIFO 缓冲区,因此单个写入是原子的。但是,如果 write_message 在内部执行多个单独的写入,您将需要一个队列来确保一个不会在前一个完成之前开始。

您可能想要使用队列(即使不需要)的一个原因是流量控制。 IOStream 的内部缓冲只能让您粗略地控制缓冲行为,因此有界队列可能更适合对您的流量源施加背压。