这该死的Python竟如此的甜美 2023-09-06 10:56 采纳率: 0%
浏览 8

sanic 框架 执行俩次工厂函数

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-06 13:30
    关注

    【以下回答由 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中可以进行其他的一些全局设置和配置,例如加载配置文件等操作。


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

报告相同问题?

问题事件

  • 创建了问题 9月6日