zoukankan      html  css  js  c++  java
  • odoo 多线程处理(AttributeError: environments)

    可以查看odoo 源码的例子:

    按常规的使用多线程调用方法,会出现环境错误.

    # -*- coding: utf-8 -*-
    # Part of Odoo. See LICENSE file for full copyright and licensing details.
    
    #
    # Order Point Method:
    #    - Order if the virtual stock of today is below the min of the defined order point
    #
    
    from odoo import api, models, tools
    
    import logging
    import threading
    
    _logger = logging.getLogger(__name__)
    
    
    class StockSchedulerCompute(models.TransientModel):
        _name = 'stock.scheduler.compute'
        _description = 'Run Scheduler Manually'
    
        def _procure_calculation_orderpoint(self):
            with api.Environment.manage():
                # As this function is in a new thread, I need to open a new cursor, because the old one may be closed
                new_cr = self.pool.cursor()
                self = self.with_env(self.env(cr=new_cr))
                scheduler_cron = self.sudo().env.ref('stock.ir_cron_scheduler_action')
                # Avoid to run the scheduler multiple times in the same time
                try:
                    with tools.mute_logger('odoo.sql_db'):
                        self._cr.execute("SELECT id FROM ir_cron WHERE id = %s FOR UPDATE NOWAIT", (scheduler_cron.id,))
                except Exception:
                    _logger.info('Attempt to run procurement scheduler aborted, as already running')
                    self._cr.rollback()
                    self._cr.close()
                    return {}
    
                for company in self.env.user.company_ids:
                    self.env['procurement.group'].run_scheduler(
                        use_new_cursor=self._cr.dbname,
                        company_id=company.id)
                new_cr.close()
                return {}
    
        def procure_calculation(self):
            threaded_calculation = threading.Thread(target=self._procure_calculation_orderpoint, args=())
            threaded_calculation.start()
            return {'type': 'ir.actions.act_window_close'}
    

    其他办法:

    放弃使用env,直接使用sql原生语句查询,
    new_cr = self.pool.cursor()
    new_cr.execute('select * from res_partner')
    res = new_cr.fetchall()

  • 相关阅读:
    Google API 详解
    Why should I use SASS?
    Google Maps and ASP.NET
    IP摄像机
    解决母版页报错“内容控件必须是内容页中的顶级控件,或是引用母版页的嵌套母版页。”
    sass服务
    C#中操作符的重载(Time类)
    第一次面试
    单链表(C++)
    指针和引用的区别(C++)
  • 原文地址:https://www.cnblogs.com/qianxunman/p/12205170.html
Copyright © 2011-2022 走看看