【问题标题】:Flask and socket.io broadcastFlask 和 socket.io 广播
【发布时间】:2013-12-11 12:46:38
【问题描述】:

我想在服务器发生某个事件时使用 SocketIO 广播消息,现在我使用此代码

http://pastebin.com/i2jNf1w5

我在启动服务器时调用gevent.spawn(loop_send_queued_messages, server)

当客户端向“/emit”发送数据时,一切正常:

  • 我看到来自broadcastbroadcasting 消息
  • 我看到来自broadcast_msgbroadcast_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

【问题讨论】:

    标签: python websocket socket.io flask


    【解决方案1】:

    这可能是您如何导入模块的一个微妙问题。 IE。您可能在两个不同的模块名称下加载了两次模块而没有意识到这一点。

    像这样修改广播()中的打印:

    print "broadcasting", name, data, id(websocket_queue), __name__
    

    确保从服务器代码调用时显示与客户端发送数据时调用时相同的 id 和模块名称。

    如果信息不匹配,那么这很可能是问题。它通常是由相对进口(这是邪恶的)引起的。在任何地方切换到absolute imports,这可能会解决它。

    在使用 Python 2.6 或更早版本时,我将from __future__ import absolute_import 添加到每个模块的顶部,以防止出现此类问题。

    【讨论】:

    • 确实这两个队列不一样,但我认为我只使用绝对导入(import module.submodule 而不是import .submodule),我该如何更改我的导入或确保对象是共享?我以为 Python 中的 import 不会重新导入文件,如果它已经被导入了?
    • 打印了哪些模块名称?你的代码相对于这个模块的布局是什么,你在哪里导入它?您的导入语句是什么样的?
    • 通过将from scripts.socket_routes import broadcast 替换为from socket_routes import broadcast 它可以工作,但我想知道导入的正确方法是什么,因为如果我开始在任何地方直接使用文件名,它可能会与系统包发生冲突,不是吗?
    • 正确,您要坚持使用绝对导入以避免与系统包冲突。导致 gevent.spawn 调用的 import 语句在哪里?那是相对导入模块的那个。
    • 我通过重构我的包让它工作了,我将所有与服务器相关的代码放在scripts/server 中,我有一个scripts/server.py 代码执行import server 来启动我的服务器,现在scripts/server/... 中的文件可以使用import server.socket_routes
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多