Torando write_message并行屈服

时间:2016-05-29 09:22:42

标签: tornado

我刚刚意识到WebSocketHandler.write_message()会返回一个Future。我之前没有在我的函数中使用这个函数:

   @tornado.gen.coroutine
   def ff(self,msg):
      try:
         self.write_message(json.dumps(msg))
      except tornado.websocket.WebSocketClosedError:
         pass

而不是:

   @tornado.gen.coroutine
   def ff(self,msg):
      try:
         yield self.write_message(json.dumps(msg))
      except tornado.websocket.WebSocketClosedError:
         pass

为什么这没有错误? (在Tornado 4.3上运行)

同样适用于设计模式:

for x in messages:
   yield self.write_message(x)

建议用并行?:

替换
yield [self.write_message(x) for x in messages]

** 并行WebSocketHandler希望将相同的消息发送到许多websockets:

# WS is a list of WebSocketHandlers. 
yield [s.write_message(message) for s in WS]

1 个答案:

答案 0 :(得分:3)

Future返回的write_message用于流量控制:它通常立即返回,但是当传出缓冲区达到一定大小时,它将等待直到先前的消息被发送。这会降低应用程序的速度以匹配网络,而不是允许它向传出缓冲区添加越来越多的消息。

这些Futures应该并行产生:它违背了目的,我认为它甚至不能可靠地工作:每次调用IOStream.write都会使前一次通话返回Future

如果您没有编写大量邮件,则可以忽略这些邮件Futures,但如果您想更好地控制应用程序使用的内存量,请一次生成一个。