現象
接上一篇,在成功實現 單一例項多庫模式下定時任務的問題後,現在可以實現多個庫的定時任務跑起來了。
但是發現在任務跑幾次後就不再執行了,每次重啟odoo例項就會恢復。但是很快又不行了。
分析
檢視程式發現,後臺開啟的兩個定時任務執行緒直接消失了。。。
檢視日誌,有段報錯,如下:
for db_name, registry in registries.d.items():
RuntimeError: OrderedDict mutated during iteration
可以定位到問題出現server.py
檔案中的cron_thread
函式上。
經過實驗發現,python3版本的OrderedDict物件在迭代的過程中如果新增或刪key物件,則會報這個錯誤,python2版本不受影響,目前測試的是python3.5+版本都會受到影響。
解決方案
問題定位後,解決方法也很簡單
def cron_thread(self, number):
from odoo.addons.base.models.ir_cron import ir_cron
while True:
time.sleep(SLEEP_INTERVAL + number) # Steve Reich timing style
registries = odoo.modules.registry.Registry.registries
_logger.debug('cron%d polling for jobs', number)
for db_name, registry in list(registries.d.items()):
if registry.ready:
thread = threading.currentThread()
thread.start_time = time.time()
try:
ir_cron._acquire_job(db_name)
except Exception:
_logger.warning('cron%d encountered an Exception:', number, exc_info=True)
thread.start_time = None
每次迭代前copy一個新的物件,這樣雖然解決的問題,但是挺奇怪的,這個到底在哪被修改的呢???
留個坑,待填。。。