我正在为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
并行增加。
我该怎么做?
答案 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。
希望这会对你有所帮助 谢谢