【odoo】【知識雜談】單一例項多庫模式下定時任務執行緒崩了

老韓頭的開發日常發表於2021-09-08

現象

接上一篇,在成功實現 單一例項多庫模式下定時任務的問題後,現在可以實現多個庫的定時任務跑起來了。
但是發現在任務跑幾次後就不再執行了,每次重啟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一個新的物件,這樣雖然解決的問題,但是挺奇怪的,這個到底在哪被修改的呢???
留個坑,待填。。。

相關文章