如何实现慢加载Python Odoo模块的后台导入,仅需时等待?
解决方案:延迟初始化Odoo连接
核心思路是把Odoo连接的初始化逻辑从模块导入阶段推迟到实际使用时执行,也就是懒加载。下面是两种可行的实现方式:
方法一:函数封装懒加载
修改odoo.py,将连接初始化逻辑封装到函数中,仅在第一次调用时建立连接:
import odoorpc from .env import ENV # 私有变量存储已建立的连接 _odoo_connection = None def get_odoo_connection(): global _odoo_connection if _odoo_connection is None: # 仅在首次调用时执行连接逻辑 _odoo_connection = odoorpc.ODOO(ENV["ODOO_HOST"], port=ENV["ODOO_PORT"]) _odoo_connection.login( db=ENV["ODOO_DB"], login=ENV["ODOO_USR"], password=ENV["ODOO_PWD"] ) return _odoo_connection
然后修改调用该连接的模块(比如category.py),在需要使用Odoo连接时调用函数:
from mongoengine import * from .odoo import get_odoo_connection class Category(DynamicDocument): name = StringField(required=True) odoo_id = StringField() def publish(self): # 仅调用publish时才会触发连接初始化 odoo = get_odoo_connection() _model = odoo.env["product.category"] self.odoo_id = _model.create({"name": self.name}) self.save()
方法二:单例类封装连接
如果需要更面向对象的实现,可以用单例类来管理Odoo连接:
修改odoo.py:
import odoorpc from .env import ENV class OdooConnector: # 类变量存储单例实例 _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) # 首次实例化时建立连接 cls._instance._init_connection() return cls._instance def _init_connection(self): self.connection = odoorpc.ODOO(ENV["ODOO_HOST"], port=ENV["ODOO_PORT"]) self.connection.login( db=ENV["ODOO_DB"], login=ENV["ODOO_USR"], password=ENV["ODOO_PWD"] ) @property def env(self): return self.connection.env
修改category.py中的调用:
from mongoengine import * from .odoo import OdooConnector class Category(DynamicDocument): name = StringField(required=True) odoo_id = StringField() def publish(self): # 首次调用时初始化连接 connector = OdooConnector() _model = connector.env["product.category"] self.odoo_id = _model.create({"name": self.name}) self.save()
原理说明
原来的代码在导入odoo.py时,会直接执行模块顶层的连接初始化代码,导致每次导入都要等待10秒的连接建立时间。而懒加载的方式将连接逻辑放到函数/类的内部,只有当实际调用publish方法(也就是真正需要使用Odoo连接时)才会执行初始化,完全避免了无用的等待时间。
内容的提问来源于stack exchange,提问作者masavini
相关产品推荐
相关产品推荐

