Python socketIO回调丢失:'收到未知回调,忽略,'

z9smfwbn  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(262)

我有一个Flask-SocketIO服务器,它连接了许多python-socketIO客户端。我想知道哪些客户端在线。为了了解这一点,我从服务器发送了一个ping事件,并使用回调函数来处理响应。
服务器代码的结构如下:

class Server:
    def ping(self):
        while True:
            self.socketio.emit(
                'ping', namespace='/some_namespace', room='some_room',
                callback=self.pong_response
            )

    def pong_response(self, client_id):
        # goal: updates the client's status as online in a database
        print(client_id)

在客户端应用程序中,我们有:

from socketio import ClientNamespace

class SocketClient(ClientNamespace):
    def on_ping(self) -> int:
        return <my_id>

现在,当我在本地运行服务器和客户机应用程序时,这可以正常工作:客户端响应服务器,我可以打印客户端应用程序发送的ID。
但是,当部署服务器应用时(在我们的示例中部署到Azure应用服务),服务器日志将打印:

socketio.server - WARNING  - Unknown callback received, ignoring.

我不知道为什么这在本地工作,而在Azure中部署时不工作。另外,这是更新哪些客户端在线的好方法吗?
可能相关的详细信息:

  • 服务器位于Flask-SocketIO==5.1.1
  • 客户端位于python-socketio==5.5.0
  • Python 3.7语言
  • 在服务器上,ping/pong在单独的线程中运行
    更新:似乎是消息队列(RabbitMQ)导致了这个问题。定义socketIO连接时,我们用途:
socketio = SocketIO(
    self.app,
    async_mode='gevent_uwsgi',
    message_queue=msg_queue,
)

message_queue=None被放进去的时候,它就可以工作了。但是,当我们想要运行多个服务器示例的时候,这显然不能解决我们的问题。我还没有弄清楚为什么它不能工作,以及我该如何解决它。

ioekq8ef

ioekq8ef1#

在做了更多的研究并最终发布了这个Github问题之后,结论是python-socketio不支持来自多个客户端的回调。
因此,由于使用回调不是实现这一点的一个选项,我改为更改代码,使客户机每N秒向服务器发送一次ping(而不是相反)。

相关问题