在现有的循环的Python异步处理(Python asynchronous processing i

2019-09-30 04:46发布

我创建了一个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的。

我怎么做?

Answer 1:

在这里你可以做什么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 import_base模块或躯干)的一些模块添加一些代码,现在什么接下来,你可以做的是,你可以扩展实现这一点,然后让服务的instace或者您也可以直接启动建立该胎面类似以下码:

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

现在这一点,我们开始其运行速度更快,给你自由使用UI后台服务。

希望这将帮助你感谢你



文章来源: Python asynchronous processing in existing loop