有没有用过sanic (一个python的web框架)的da 佬啊,为什么他会执行俩次我的工厂函数,导致我写在工厂函数的模型会被加载俩次。(我照着常规flask项目组织的目录结构,工厂函数写在__init__里面),是因为Worker Manager 的问题吗,我现在使用--single-process解决了这个问题,但是我觉得不是最好的解决问题方式,想请教一下各位。有没有遇到同样问题的。
1条回答 默认 最新
关注【以下回答由 GPT 生成】
问题的解决方案如下:
-
检查是否在代码中调用了两次Sanic的工厂函数。确保工厂函数只被调用一次。
-
如果工厂函数是写在
__init__.py中的,确保它没有被其他文件中的代码直接或间接地引用了两次。可以在工厂函数中添加一个打印语句,用于验证是否被调用了两次。 -
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中可以进行其他的一些全局设置和配置,例如加载配置文件等操作。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报-