我需要一个套接字对模式的队列吗?
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_message
和 on_message
的定义方式。对于在 Tornado IOStream 之上实现的许多协议,包括 Tornado 的 WebSocketHandler,1:1 配对不需要队列,因为 IOStream.write
有一个内部 FIFO 缓冲区,因此单个写入是原子的。但是,如果 write_message 在内部执行多个单独的写入,您将需要一个队列来确保一个不会在前一个完成之前开始。
您可能想要使用队列(即使不需要)的一个原因是流量控制。 IOStream 的内部缓冲只能让您粗略地控制缓冲行为,因此有界队列可能更适合对您的流量源施加背压。
我正在编写一个 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_message
和 on_message
的定义方式。对于在 Tornado IOStream 之上实现的许多协议,包括 Tornado 的 WebSocketHandler,1:1 配对不需要队列,因为 IOStream.write
有一个内部 FIFO 缓冲区,因此单个写入是原子的。但是,如果 write_message 在内部执行多个单独的写入,您将需要一个队列来确保一个不会在前一个完成之前开始。
您可能想要使用队列(即使不需要)的一个原因是流量控制。 IOStream 的内部缓冲只能让您粗略地控制缓冲行为,因此有界队列可能更适合对您的流量源施加背压。