Python SocketIO,运行 socketio 服务器在后台

Python SocketIO, run socketio server in background

如何启动 SocketIO 服务器并让它在后台监听,同时我继续在主线程上执行代码?

现在我正在使用 python-socketio 包。我还测试了 flask-socketio,它使用 python-socketio。 https://python-socketio.readthedocs.io/en/latest/server.html

我最常尝试的是使用 sio.start_background_task.

启动服务器

例如:

class SocketIOServer(socketio.AsyncNamespace):
  def __init__(self):
    super().__init__()
    self.sio = socketio.AsyncServer()
    self.sio.register_namespace(self)
    self.app = web.Application()
    self.sio.attach(self.app)
    self.task = None

  def run(self):
    web.run_app(self.app, port=8080)

  def start(self):
    self.task = self.sio.start_background_task(self.run)

我尝试了上述方法和多种变体,例如使用 Flask、Tornado 等

更清楚地说,这基本上是我想要做的:

if __name__ == '__main__':
  # ...
  # start app, e.g. -> web.run_app(self.app, port=8080)
  # I want to continue to execute code here

我不完全明白一切是如何运作的,我问的是不是一个愚蠢的问题?

问题和你描述的一样。你没有完全理解一切是如何运作的。

您遗漏的最重要的事情是 python-socketio 包不是网络服务器。这个包只实现了 Socket.IO 逻辑,但是你必须添加一个 Web 服务器,通过它你的 Socket.IO 代码是可用的。

从您问题中包含的代码来看,您似乎已选择将 Socket.IO 代码附加到使用 aiohttp 框架构建的 Web 应用程序,并使用其自己的 Web 服务器。正确吗?

那么您真正的问题是如何以 non-blocking 方式 运行 aiohttp 网络服务器。

运行发现 aiohttp 在他们的文档中有这方面的信息:https://docs.aiohttp.org/en/stable/web_advanced.html#application-runners。他们的例子是这样做的:

runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, 'localhost', 8080)
await site.start()  # <-- starts the server without blocking

# you can do whatever you want here!