我刚刚意识到 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]
**
Parallel WebSocketHandler 想要向大量 websocket 发送相同的消息:
# WS is a list of WebSocketHandlers.
yield [s.write_message(message) for s in WS]
最佳答案
Future
返回的 write_message
用于流量控制:它通常立即返回,但是当传出缓冲区达到一定大小时,它将等到更早的消息发送完毕。这会减慢应用程序以匹配网络的速度,而不是允许它向传出缓冲区添加越来越多的消息。
这些 Futures
不应该并行产生:它违背了目的,我认为它甚至不能可靠地工作:对 IOStream.write
的每次调用都会使前一次调用返回的 Future
无效。
如果您没有编写大量消息,则可以忽略这些 Futures
,但如果您想更好地控制应用程序消耗的内存量,请一次生成一个。
关于tornado - Tornado write_message 并行屈服,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37508197/