0

次のプログラムを実行すると:

import threading
class foo(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def __enter__(self):
        print "Enter"
    def __exit__(self, type, value, traceback):
        print "Exit"

    def run():
        print "run"



if __name__ == "__main__":
    with foo() as f:
        f.start()

これを出力として取得します

C:\>python test2.py
Enter
Exit
Traceback (most recent call last):
  File "test2.py", line 17, in <module>
    f.start()
AttributeError: 'NoneType' object has no attribute 'start'

with キーワードの保証されたクリーンアップ コードの実行をスレッド化されたクラスと組み合わせる方法はありますか?

4

2 に答える 2

4
import threading
class foo(threading.Thread):
    def __enter__(self):
        print "Enter"
        return self
    def __exit__(self, type, value, traceback):
        self.join() # wait for thread finished
        print "Exit"
    def run(self):
        print "run"

if __name__ == "__main__":
    with foo() as f:
        f.start()

メソッドは次のように__enter__する必要がreturn selfあります。それが構成内の変数に割り当てられるものwith ... as fです。

@linjunhalida が提案する__exit__ようにスレッドを参加させることも良い考えですが、現在の問題は発生しません。

使用可能にしたい場合は、 runtoの定義も変更する必要があります。def run(self):)

于 2012-08-30T01:20:14.540 に答える
-3

join を使用してスレッドの実行が完了するのを待つだけです: http://docs.python.org/library/threading.html#threading.Thread.join

import threading
class foo(threading.Thread):
    def __init__(self):
        self.thread = threading.Thread.__init__(self)
    def __enter__(self):
        print "Enter"
    def __exit__(self, type, value, traceback):
        self.thread.join() # wait for thread finished
        print "Exit"

    def run():
        print "run"



if __name__ == "__main__":
    with foo() as f:
        f.start()
于 2012-08-30T01:19:22.280 に答える