我想在服务器上的某个事件发生时使用SocketIO来广播消息,现在我使用这个代码
我在启动服务器时调用gevent.spawn(loop_send_queued_messages, server)
当客户端向'/ emit'发送数据时,一切正常:
broadcasting
broadcast
消息
broadcast_msg
broadcast_msg
消息
但是,如果在服务器的另一部分我导入broadcast
函数并且我从某个端点使用它(例如在用户发送文件之后),我只看到第一个broadcasting
消息从调用到broadcast
,但似乎消息未正确添加到队列中,因为永远不会调用broadcast_msg
有人能告诉我在Flask中使用SocketIO从我的服务器代码中的任何位置进行广播的最佳方法吗?
[编辑]考虑到下面的评论,我有这个
broadcasting newDatasetAvailable features 4363892432 scripts.socket_routes
127.0.0.1 - - [2013-12-11 15:56:07] "POST /datastore/features HTTP/1.1" 200 115 0.003130
broadcasting msg refreshData 4363648208 socket_routes
127.0.0.1 - - [2013-12-11 15:56:07] "POST /emit HTTP/1.1" 200 115 0.000540
broadcast_msg msg (u'refreshData',)
所以一个是scripts.socket_routes
,另一个是socket_routes
/emit
端点与websocket_queue
在同一文件中定义,POST
到/datastore
使用其他文件中的broadcast
方法,像这样导入它:
from scripts.socket_routes import broadcast
结构是:
scripts/
__init__.py
socket_routes.py # where websocket_queue and broadcast are defined
dataset_routes.py # where broadcast is imported
答案 0 :(得分:0)
这可能是您导入模块的一个微妙问题。即您可能在两个不同的模块名称下加载了两次模块而没有实现它。
修改broadcast()中的print,如下所示:
print "broadcasting", name, data, id(websocket_queue), __name__
确保从服务器代码调用时显示相同的id和模块名称,就像客户端发送数据时调用的那样。
如果信息不匹配,那么这可能就是问题所在。它通常是由相对进口(这是邪恶的)引起的。在任何地方切换到absolute imports,这可能会解决问题。
使用Python 2.6或更早版本时,我将from __future__ import absolute_import
添加到每个模块的顶部以防止出现这些问题。