Javascript 当异步模式为“线程化”时,Flask.SocketIO无法将数据异步发送给已注册的参与者

Javascript 当异步模式为“线程化”时,Flask.SocketIO无法将数据异步发送给已注册的参与者,javascript,python,flask,socket.io,Javascript,Python,Flask,Socket.io,编辑:随着问题的性质变得更加清楚,更新了标题 我试图实现一个非常简单的socket.io连接,将广播事件从Flask服务器发送到Javscript客户端。第一条服务器消息到达客户端,但不再到达。在服务器端,它通过定期数据更新不断调用emit,但客户端在第一次更新之后从未收到任何消息 以下是从React应用程序中提取的JavaScript客户端相关行: var io=require('socket.io-client') var socket = io.connect(); socket.on('

编辑:随着问题的性质变得更加清楚,更新了标题

我试图实现一个非常简单的socket.io连接,将广播事件从Flask服务器发送到Javscript客户端。第一条服务器消息到达客户端,但不再到达。在服务器端,它通过定期数据更新不断调用emit,但客户端在第一次更新之后从未收到任何消息

以下是从React应用程序中提取的JavaScript客户端相关行:

var io=require('socket.io-client')
var socket = io.connect();
socket.on('connect', function() {
   console.log('Connection established');
});


socket.on('message', function(data){
   console.log('Message received');
   console.log(data);
   //only gets called for the first message sent by the server
}
和Flask服务器代码:

from flask_socketio import SocketIO, emit
app = Flask(...)
socketio = SocketIO(app, async_mode="eventlet")
socketio.emit('message', "Test data", broadcast=True)

#Update function called periodically with JSON data
#of the form {"data": {...}}
def update(data):
    data = json.dumps(data)
    socketio.emit('message', data, broadcast=True)
客户端接收测试数据消息,但没有从更新函数中发送的消息

编辑:我在/usr/lib/python2.7/site-packages/socketio/base_manager.py中找到了这段代码

for sid in self.get_participants(namespace, room):
            if sid != skip_sid:
                if callback is not None:
                    id = self._generate_ack_id(sid, namespace, callback)
                else:
                    id = None
                self.server._emit_internal(sid, event, data, namespace, id)
在调试器中,当服务器发送原始测试数据和后续更新时,我看到了表示socket.io客户端的sid值。因此,服务器仍然将客户机视为参与者,其ID与开始时相同,但客户机没有收到任何后续更新。如果在update函数发出任何事件之前,我一行发出两条消息,那么客户端将获得它们。但是,客户端不会接收更新函数内发出的任何事件

我认为这是某种范围问题,但如果在update方法中发出事件时,服务器仍将客户机视为参与者,则似乎不存在范围问题。我还在一个答案中尝试了将socketio对象传递给update函数的建议,得到了相同的行为。我无法理解,当某个函数的执行上下文显示客户端仍然是参与者时,为什么客户端仅仅因为服务器从某个特定函数发送事件而不接收事件


这是我能想到的最简单的一个例子,我正在做我在网上看到的每一个例子中看到的同样的事情。显然,我遗漏了一些东西。

我想您是否遗漏了客户端的接收方法。。。 请参阅

socket.on'test',函数数据{ 控制台日志数据;
};

我想你错过了客户端的接收方法。。。 请参阅

socket.on'test',函数数据{ 控制台日志数据;
};

我在Flask服务器上创建SocketIO实例时,通过将async_mode设置为True,可以使其正常工作

也就是说,我将socketio=SocketIOapp,async_mode=eventlet更改为socketio=SocketIOapp,async_mode=threading

我不知道为什么它不能与eventlet正常工作,这似乎是首选模式,因为根据docstring,如果您不指定,threaded是最后一个尝试的模式


如果我能更准确地理解线程和其他异步模式在实现上的区别,也许我能弄明白为什么只有当我使用文档中所说的性能最低的模式时,它才起作用。也许我错过了,但我在文档中没有看到这样的解释,只是对不同模式之间的依赖性差异进行了模糊的讨论。

当我在Flask服务器上创建SocketIO实例时,通过将async_mode设置为True,我能够使它正常工作

也就是说,我将socketio=SocketIOapp,async_mode=eventlet更改为socketio=SocketIOapp,async_mode=threading

我不知道为什么它不能与eventlet正常工作,这似乎是首选模式,因为根据docstring,如果您不指定,threaded是最后一个尝试的模式


如果我能更准确地理解线程和其他异步模式在实现上的区别,也许我能弄明白为什么只有当我使用文档中所说的性能最低的模式时,它才起作用。也许我错过了,但我在文档中没有看到这样的解释,只是模糊地讨论了不同模式之间的依赖性差异。

谢谢,但我不确定我是否理解您的建议。我在“message”上有socket.on,在客户端上有functiondata{…},如我所示。这不是我接收消息事件所需要的吗?这就是我在服务器端发出的事件。客户端在我第一次发出它时收到它,而不是在从更新函数调用它时收到它。很抱歉,我在nodeJS中使用socket。。更新功能中是否有socketio。尝试将更新函数中的socketio作为参数传递。谢谢,但我不确定我是否理解您的建议。我在“message”上有socket.on,在客户端上有functiondata{…},如我所示。这不是我接收消息事件所需要的吗?这就是我在服务器端发出的事件。客户端在我第一次发出它时收到它,而不是在从更新函数调用它时收到它。很抱歉,我在nodeJS中使用socket。。更新功能中是否有socketio。尝试将更新函数中的socketio作为参数传递。