我刚刚意识到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]
答案 0 :(得分:3)
Future
返回的write_message
用于流量控制:它通常立即返回,但是当传出缓冲区达到一定大小时,它将等待直到先前的消息被发送。这会降低应用程序的速度以匹配网络,而不是允许它向传出缓冲区添加越来越多的消息。
这些Futures
应该不并行产生:它违背了目的,我认为它甚至不能可靠地工作:每次调用IOStream.write
都会使前一次通话返回Future
。
如果您没有编写大量邮件,则可以忽略这些邮件Futures
,但如果您想更好地控制应用程序使用的内存量,请一次生成一个。