我创建了一个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
的。
我怎么做?
在这里你可以做什么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后台服务。
希望这将帮助你感谢你