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!
如何启动 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!