sanic 框架 执行俩次工厂函数

有没有用过sanic (一个python的web框架)的da 佬啊,为什么他会执行俩次我的工厂函数,导致我写在工厂函数的模型会被加载俩次。(我照着常规flask项目组织的目录结构,工厂函数写在__init__里面),是因为Worker Manager 的问题吗,我现在使用--single-process解决了这个问题,但是我觉得不是最好的解决问题方式,想请教一下各位。有没有遇到同样问题的。

【以下回答由 GPT 生成】

问题的解决方案如下:

  1. 检查是否在代码中调用了两次Sanic的工厂函数。确保工厂函数只被调用一次。

  2. 如果工厂函数是写在__init__.py中的,确保它没有被其他文件中的代码直接或间接地引用了两次。可以在工厂函数中添加一个打印语句,用于验证是否被调用了两次。

  3. Sanic框架在处理HTTP请求时会创建多个Worker进程来处理并发请求,因此如果每个进程都执行了工厂函数,就会导致工厂函数被执行多次。可以将工厂函数放在一个单独的文件中,并使用Sanic自带的@app.listener("before_server_start")装饰器来触发工厂函数的执行。这样每个Worker进程在启动时只会执行一次工厂函数。

示例代码如下:

# factory.py
def create_app():
    # 在这里创建你的Sanic应用
    app = Sanic(__name__)
    # 添加路由、中间件等其他设置
    # ...
    return app

# main.py
from factory import create_app
from sanic import Sanic

app = Sanic(__name__)

@app.listener('before_server_start')
async def setup_app(app, loop):
    app.config.from_pyfile('config.py')  # 加载配置文件
    app = create_app()  # 调用工厂函数创建Sanic应用

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, workers=4)  # 运行Sanic应用

在上述示例代码中,create_app()函数是工厂函数,将Sanic应用的创建过程放在了单独的文件factory.py中。在main.py中,调用create_app()函数的代码放在了app.listener("before_server_start")装饰器的回调函数中,确保每个Worker进程在启动时只会执行一次工厂函数。

这样做的好处是,确保只有一个进程执行工厂函数,有效避免了模型被加载多次的问题。另外,在main.py中可以进行其他的一些全局设置和配置,例如加载配置文件等操作。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^