2017-02-03 15 views
2

odoo 10では、self.envを使用してモデルを呼び出すメソッドを呼び出すスレッドがあります。しかし、ときに、システムは私がこれを占有し、このような例外をスローすることはできません。Odoo:スレッド内のself.envまたは別のモデルを呼び出す

Exception in thread Thread-44: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner 
self.run() 
    File "/usr/lib/python2.7/threading.py", line 754, in run 
self.__target(*self.__args, **self.__kwargs) 
    File "/home/kunder/proyectos/odoo/addons/kunder_odoo_comercionet/models/models.py", line 97, in update_quotations_thread 
quotation_list = self.download_comercionet_docs(); 
    File "/home/kunder/proyectos/odoo/addons/kunder_odoo_comercionet/models/models.py", line 370, in download_comercionet_docs 
new_last_date_db = (self.env["ftp_orders.settings"]).search([])[0].last_date 
    File "/home/kunder/proyectos/odoo/odoo/models.py", line 1508, in search 
res = self._search(args, offset=offset, limit=limit, order=order, count=count) 
    File "/home/kunder/proyectos/odoo/odoo/models.py", line 4193, in _search 
self.sudo(access_rights_uid or self._uid).check_access_rights('read') 
    File "/home/kunder/proyectos/odoo/odoo/models.py", line 4842, in sudo 
return self.with_env(self.env(user=user)) 
    File "/home/kunder/proyectos/odoo/odoo/api.py", line 781, in __call__ 
return Environment(cr, uid, context) 
    File "/home/kunder/proyectos/odoo/odoo/api.py", line 726, in __new__ 
env, envs = None, cls.envs 
    File "/home/kunder/proyectos/odoo/odoo/tools/func.py", line 111, in __get__ 
return self.fget.__get__(None, owner)() 
    File "/home/kunder/proyectos/odoo/odoo/api.py", line 699, in envs 
return cls._local.environments 
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 72, in __getattr__ 
    raise AttributeError(name) 
    AttributeError: environments 

私がモデルにスレッドを処理し、私はスレッドを処理する方法は次のとおりです。

def thread_method(self): 
    #This method call other model like this and do some other stuff 
    self.env['sale.order'].search([]) 
def main_method(self): 
    threading.Thread(target = self.method_thread).start() 

私はコードをデバッグしてmain_methodに座っていれば、thread_methodを持つself.envと同じオブジェクトがあるので、なぜ動作しないのかわかりません。

スレッド内で別のモデルをリクエストするにはどうすればよいですか?

おかげ

+0

完全なスタックトレースを共有してください –

+0

@GeorgeDaramouskas完全なスタックトレースは更新です –

答えて

3

を使用することを考慮すれば、あなた自身の環境を作成する必要が

from openerp import models, api 
from openerp.modules.registry import Registry 

def threaded_method(self): 
    with api.Environment.manage(): 

よりhttps://github.com/odoo/odoo/blob/10.0/addons/stock/wizard/procurement_orderpoint_compute.py#L21

+0

それは動作し、私のメソッドはスレッドで実行されています。しかし、モデルにレコードを追加するときに問題がありますが、追加でエラーが発生することはありませんが、引用モジュールで販売モジュールが表示されるときに追加情報が表示されない場合があります。 –

+0

odooは1つのトランザクションのためだけに環境を作成するので、別のスレッドでメソッドを実行すると、通常のプロセスはその作業を行い、その環境をガベージします。あなたのスレッドメソッドがまだ動いている間 –

3

あなたはOdooアドオンからprocurement_orderpoint_compute.pyファイル内のスレッドを開始する方法の例を見つけることができます。

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('procurement.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 {} 

     self.env['procurement.order']._procure_orderpoint_confirm(
      use_new_cursor=new_cr.dbname, 
      company_id=self.env.user.company_id.id) 
     new_cr.close() 
     return {} 

それとも、より良いあなたがスレッド化の方法についてOCA queue

+0

それは動作し、私のメソッドはスレッドで実行されています。しかし、モデルにレコードを追加するときに問題がありますが、追加でエラーが発生することはありませんが、引用モジュールで販売モジュールが表示されるときに追加情報が表示されない場合があります。 –

0
new_cr = self.pool.cursor() 
self = self.with_env(self.env(cr=new_cr)) 

pdb.set_trace() 

id_data=self.env['cw.test.module'].create({'name':self.id}) 
id_data.master_data() 
new_cr.commit() 

new_cr.close() 

のチェックこれをnew_cr.commit()を使用して新しいcurをコミットするsor

関連する問題