9

アプリケーションに (デコレータを使用して) スレッド化を実装しようとしていますが、ロックとスレッドの管理に関するいくつかのことを理解できません。

import threading

def run_in_thread(fn):
    def run(*k, **kw):
        t = threading.Thread(target=fn, args=k, kwargs=kw)
        t.start()
    return run

class A:
    @run_in_thread
    def method1(self):
        for x in range(10000):
            print x


    @run_in_thread
    def method2(self):
        for y in list('wlkefjwfejwiefwhfwfkjshkjadgfjhkewgfjwjefjwe'):
            print y

    def stop_thread(self):
        pass

c = A()
c.method1()
c.method2()
  1. 私が理解しているように、method1とmethod2は同期されていませんが、ロックの助けを借りて実装されているものの同期です。デコレータ関数にロックを追加するにはどうすればよいですか?

  2. デコレータを使用して長いスレッドを停止する方法を実現するにはどうすればよいですか?

4

3 に答える 3

9

機能を拡張すると

def run_in_thread(fn):
    def run(*k, **kw):
        t = threading.Thread(target=fn, args=k, kwargs=kw)
        t.start()
        return t # <-- this is new!
    return run

つまり、ラッパー関数が作成されたスレッドを返すようにします。

c = A()
t1 = c.method1()
t1.join() # wait for it to finish
t2 = c.method2()
# ...

私。e、元のメソッドが実行されているスレッドを取得し、それで必要なことを何でも行い(たとえば、参加する)、その後で次のメソッドを呼び出します。

特定のケースで必要ない場合は、自由に省略できます。

于 2013-10-21T13:20:42.313 に答える