1

進行中のプロセスを起動する必要がある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 bobCTRL+CPass 2

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

と並行してパスを増やしていきたいhello bobです。

それ、どうやったら出来るの?

4

1 に答える 1

2

ここでできることは、サーバーメモリの下にPythonのマルチスレッド実装を作成してから作成できます。これは独立して実行され、サーバー実行スレッドになります。この背後にあるトリックが使用されます。必要なクリックでサーバーから1つのスレッドをフォークし、すべてのサーバー変数の個別のコピーを新しいスレッドに割り当てて、スレッドが独立して実行されるようにします。その後、プロセスの最後にトランザクションをコミットする必要があります。このプロセスはメインサーバープロセスではありません。ここにそれをどのように行うことができるかの小さな例があります。

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モジュールまたはトランク)のようなモジュールにコードを追加できます。次にできることは、これを拡張実装してからサービスをインストールするか、次のようにトレッドを直接フォークし始めることです。コード:

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

これで、より高速に実行され、UIを自由に使用できるバックグラウンドサービスを開始します。

これがあなたに役立つことを願っていますありがとう

于 2012-06-06T10:17:17.427 に答える