Odoo后台进程-如何运行线程

在主流程中进行一些长时间的操作或并行调用时,您是否超时?

您将有一些选择以其他方式处理此问题。 最典型的是设置计划的操作,然后使其在合理的时间间隔内进行处理。

无论如何,我们总是可以学习研究服务器代码,这是采购模块v9.0的一个很好的例子:

  def _procure_calculation_all(self,cr,uid,ids,context = None): 
  “” 
  @param self:对象指针。 
  @param cr:数据库游标 
  @param uid:当前登录用户的ID 
  @param id:选择的ID列表 
  @param上下文:标准字典 
  “” 
 使用Environment.manage(): 
  proc_obj = self.pool.get('procurement.order') 
  #由于此函数位于新线程中,因此我需要打开一个新游标,因为旧游标可能已关闭 
  new_cr = self.pool.cursor() 
  scheduler_cron_id = self.pool ['ir.model.data']。get_object_reference(new_cr,SUPERUSER_ID,'procurement','ir_cron_scheduler_action')[1] 
  #避免同时运行调度程序多次 
 尝试: 
 使用tools.mute_logger('openerp.sql_db'): 
  new_cr.execute(“从ir_cron那里的SELECT ID,其中ID =%s正在更新,”,(scheduler_cron_id,)) 
 例外: 
  _logger.info(“尝试停止运行采购计划程序,因为它已经在运行”) 
  new_cr.rollback() 
  new_cr.close() 
 返回{} 
 用户= self.pool.get('res.users')。browse(new_cr,uid,uid,context = context) 
  comps = [x.id for user.company_ids中的x] 
 对于补偿: 
  proc_obj.run_scheduler(new_cr,uid,use_new_cursor = new_cr.dbname,company_id = comp,context = context) 
  #关闭新光标 
  new_cr.close() 
 返回{} 

然后,最后,触发与UI上的按钮关联的计算的函数:

  def procure_calculation(self,cr,uid,ids,context = None): 
  “” 
  @param self:对象指针。 
  @param cr:数据库游标 
  @param uid:当前登录用户的ID 
  @param id:选择的ID列表 
  @param上下文:标准字典 
  “” 
  threaded_calculation = threading.Thread(target = self._procure_calculation_all,args =(cr,uid,ids,context)) 
  threaded_calculation.start() 
 返回{'type':'ir.actions.act_window_close'} 

希望现在您能够处理超时。

如果您遇到任何问题,请告诉我们。 如果一切顺利,很高兴我们能为您提供帮助!