gpt4 book ai didi

javascript - Tornado WebSocketHandler 可以异步接收消息吗?

转载 作者:行者123 更新时间:2023-11-30 00:20:00 28 4
gpt4 key购买 nike

在 python 方面,我创建了一个 WebSocketHandler

from tornado import gen
from tornado.escape import json_decode
from tornado.websocket import WebSocketHandler

class Echo(WebSocketHandler):
...
@gen.coroutine
def on_message(self, message):
message = json_decode(message)
response = yield self.do_echo(message)
self.write_message(response)

@gen.coroutine
def do_echo(self, message):
# emulate long, blocking call
sleep(randint(0, 5))
raise gen.Return(message)

在 javascript 方面,我同时启动多个客户端(不同的浏览器):

var ws = new WebSocket('ws://localhost:5000/echo');

ws.onmessage = function (evt) {
console.log(JSON.parse(evt.data));
}

for (var i = 0; i < 10; i++) {
var msg = {
messageid: i,
payload: 'An echo message.'
};
ws.send(JSON.stringify(msg));
}

正如预期的那样,所有客户端大致同时完成。但是,每个客户端收到的消息都按照它们发送的确切顺序 (messageid) 进行记录,就好像 WebSocketHandler 正在排队消息一样。服务器端的 Python 日志也反射(reflect)了这一点。

那么,我的问题是:

  • 为什么每条消息都按发送顺序读取和返回?
  • 是否有可能规避这种排队行为?怎么样?
  • 我是否完全遗漏了一些令人尴尬的基本知识?

请注意,这不是真实代码,而是合理的复制品。

最佳答案

您绝不能在 IOLoop 线程上运行“长时间的阻塞调用”,因为那样会阻塞其他一切。该 sleep 调用(或它代表的任何内容)必须被重写为异步或移交给另一个线程(这对于 concurrent.futures.ThreadPoolExecutor 来说相当容易).参见 http://www.tornadoweb.org/en/stable/faq.html#why-isn-t-this-example-with-time-sleep-running-in-parallel有关更多信息。

关于javascript - Tornado WebSocketHandler 可以异步接收消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33484500/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com