现有循环中的Python异步处理

时间:2012-06-05 11:54:49

标签: asynchronous python-2.6 openerp

我正在为OpenERP创建一个模块,我必须在其中启动一个持续的过程。

OpenERP以连续循环方式运行。当我点击一个按钮时,我的进程必须启动,它必须继续运行而不会阻止OpenERP的执行。

为简化起见,我有这段代码:

#!/usr/bin/python
import multiprocessing
import time

def f(name):
    while True:
        try:
            print 'hello', name
            time.sleep(1)
        except KeyboardInterrupt:
            return

if __name__ == "__main__":
    count = 0
    while True:
        count += 1
        print "Pass %d" % count
        pool = multiprocessing.Pool(1)
        result = pool.apply_async(f, args=['bob'])
        try:
            result.get()
        except KeyboardInterrupt:
            #pass
            print 'Interrupted'
        time.sleep(1)

执行时,Pass 1会被打印一次,然后会打印出无尽的hello bob系列,直到按下CTRL+C。然后获得Pass 2,依此类推,如下所示:

Pass 1
hello bob
hello bob
hello bob
^CInterrupted
Pass 2
hello bob
hello bob
hello bob
hello bob

我希望传递与hello bob并行增加。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

在这里你可以做什么id你可以在服务器内存下创建Python的多线程实现,它将独立于服务器执行线程运行。 我将在你需要的点击中从服务器分叉一个线程,然后我们将所有服务器变量单独的副本分配给新线程,以便线程将独立执行,然后在进程结束时你必须提交事务这个过程将不是主服务器进程。这里有一个小例子,你可以怎么做。

import pprint
import pooler
from threading import Thread
import datetime
import logging
pp = pprint.PrettyPrinter(indent=4)

class myThread(Thread):
    """
    """
    def __init__(self, obj, cr, uid, context=None):
        Thread.__init__(self)
        self.external_id_field = 'id'
        self.obj = obj
        self.cr = cr
        self.uid = uid
        self.context = context or {}
        self.logger = logging.getLogger(module_name)
        self.initialize()

    """
        Abstract Method to be implemented in the real instance
    """
    def initialize(self):
        """
            init before import
            usually for the login
        """
        pass

    def init_run(self):
        """
            call after intialize run in the thread, not in the main process
            TO use for long initialization operation
        """
        pass

    def run(self):
        """
            this is the Entry point to launch the process(Thread)
        """
        try:
            self.init_run()
            #Your Code Goes Here
            #TODO Add Business Logic
            self.cr.commit()
        except Exception, err:
            sh = StringIO.StringIO()
            traceback.print_exc(file=sh)
            error = sh.getvalue()
            print error
        self.cr.close()

喜欢这个你可以在某些模块中添加一些代码,例如6.1或trunk中的import_base模块 现在接下来你可以做的是你可以对此进行扩展实现,然后对服务进行实施,或者你可以像下面的代码那样直接开始分叉:

    service = myServcie(self, cr, uid, context)
    service.start()

现在我们开始运行更快的后台服务,让您可以自由使用UI。

希望这会对你有所帮助 谢谢