Threads in OpenERP

Threading in OpenERP can be very useful especially on Gunicorn instance as it helps in accomplishing a task ‘n’ times faster where n is the number of concurrent threads running.

Step 1- Define custom Thread class


import threading
class SampleThread (threading.Thread):
   def __init__(self, cr, uid, arg1, arg2, context=None):
      self.cr = cr
      self.uid = uid
      self.arg1 = arg1
      self.arg2 = arg2
      self.context = context
      threading.Thread.__init__(self)

   def run(self):
      self.cr = pooler.get_db(self.cr.dbname).cursor()
      my_instance = pooler.get_pool(self.cr.dbname).get('sale.order')
      my_instance._do_action(self.cr, self.uid, self.arg1, self.arg2, self.context)

Step 2- Calling Threads

Threads can now be called from main function-

def _call_threads(self,cr,uid,ids,context={})
   threads = []
   for i in range(0,no_of_process):
      thread = SampleThread(cr,uid,arg1,arg2,context)
      threads += [thread]
      thread.start()
     .
     .
     // Remaining Code

no_of_process is the number of concurrent threads we wish to run.

Step 3- Wait for the threads to terminate

We now need to ensure that all the threads have completed, so that the remaining code in the _call_threads function executes. For that, we do-

for thread in threads:
   thread.join()

If we don’t do this, then the calling thread and called threads executes simultaneously.

One thought on “Threads in OpenERP

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s