【发布时间】:2019-04-04 08:43:07
【问题描述】:
简要介绍一下我的情况: 我正在编写一个服务器(扭曲供电),它处理与多个客户端(超过 1000 个)的 WebSocket 连接。在该流程中,从服务器发送到客户端的消息通过 Redis pub/subinterface 处理(因为消息可以通过 REST 应用):
- REST 将命令附加到客户端并发布,
- twisted 被戳中,因为它订阅了那个 redis 频道,
- 消息被添加到客户端队列并等待进一步处理
现在,当客户端连接并注册时,我将启动 inlineCallback 让每个客户端扫过队列,如下所示:
@inlineCallbacks
def client_queue_handler(self, uuid):
queue = self.send_queue[uuid]
client = self.get_client(uuid)
while True:
uniqueID = yield queue.get()
client_context = self.redis_handler.get_single(uuid)
msg_context = next(iter([msg
for msg in client_context
if msg['unique'] == unique]),
None)
client.sendMessage(msg_context)
正如我之前所说,许多客户端可能会连接。这完全没问题,每个客户端都有自己的inlineCallback 执行无限循环吗?据我所知,twisted 有可自定义的线程池限制。如果线程池中的客户端(inlineCallbacks)多于线程,会发生什么? queue.get() 会阻止/休眠该“虚拟线程”并将控制权传递给另一个吗?也许一个覆盖所有客户端的“全局”线程是更好的选择?
【问题讨论】: