
在主流程中进行一些长时间的操作或并行调用时,您是否超时?
您将有一些选择以其他方式处理此问题。 最典型的是设置计划的操作,然后使其在合理的时间间隔内进行处理。
无论如何,我们总是可以学习研究服务器代码,这是采购模块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'}
希望现在您能够处理超时。
如果您遇到任何问题,请告诉我们。 如果一切顺利,很高兴我们能为您提供帮助!