我有一个发送消息的应用程序,该消息应该广播到每个当前连接的客户端。假设客户数量可能达到数千。如何在不阻塞的情况下实现这个广播逻辑?
我认为会阻止的示例代码:
clients = []
class Broadcaster(tornado.websocket.WebSocketHandler):
def on_message(self, message):
for client in clients:
self.write_message(message)
我在网上找到的每个例子都像上面的代码。有一些例子使用@gen.coroutine
但我不明白这个装饰器在这种情况下有何帮助。
WebSocketHandler.write_message
不会阻塞网络 I/O,因此速度会相当快,但如果您有大量客户端,它仍然会增加。我建议进行一些性能测试,看看广播消息实际需要多长时间(请记住消息的大小也很重要,并且写入字节字符串比写入字典要快得多,因为字典将被重新写入)每次都编码为 json)。如果事实证明花费的时间超出了您在应用程序中可以容忍的阻塞时间,请添加一个yield gen.moment
定期循环:
@gen.coroutine
def broadcast_message(self, message):
count = 0
for client in self.clients:
client.write_message(message)
count += 1
if count % 100 == 0:
yield gen.moment
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)