2013-08-24 7 views
7

インスタンスを作成するとすぐにクラスを新しいスレッドで開始する方法について、私は最後の1時間(s ???)を探していました。Pythonクラスのインスタンスは新しいスレッドでメソッドを開始します

私はこのような何かを実行することができます:

x = myClass() 

def updater(): 
    while True: 
     x.update() 
     sleep(0.01) 

update_thread = Thread(target=updater) 
update_thread.daemon = True 
update_thread.start() 

よりエレガントな方法は、それがインスタンス化されたときのinitでそれをやってクラスを持っていることであろう。 そのクラスのインスタンスが10個あると想像してください... これまではこの問題の解決策を見つけることができませんでした... 実際のクラスはタイマーであり、メソッドはすべてのカウンタの変数を更新する更新メソッドです。このクラスでは、指定された時間に関数を実行する必要があるため、時間の更新はメインスレッドによってブロックされません。

ご迷惑をおかけして申し訳ありません。事前にTHX ...

+1

「MyClas .__ init__」にそのコードを挿入しようとしたときに、どのような問題が発生しましたか? – user4815162342

答えて

14

あなたは、スレッド内の関数(またはmemberfunction)を実行するためには、この特定のケース

from threading import Thread 

class MyClass(Thread): 
    def __init__(self, other, arguments, here): 
     super(MyClass, self).__init__() 
     self.daemon = True 
     self.cancelled = False 
     # do other initialization here 

    def run(self): 
     """Overloaded Thread.run, runs the update 
     method once per every 10 milliseconds.""" 

     while not self.cancelled: 
      self.update() 
      sleep(0.01) 

    def cancel(self): 
     """End this timer thread""" 
     self.cancelled = True 

    def update(self): 
     """Update the counters""" 
     pass 

my_class_instance = MyClass() 

# explicit start is better than implicit start in constructor 
my_class_instance.start() 

# you can kill the thread with 
my_class_instance.cancel() 
+0

半分で私を打つ。 +1は良い答えです。おそらく、更新メソッドのシグネチャは少なくとも完全に動作するコードのように見えるので、少なくともシグネチャを含めるべきです。また、 'sleep'のimportステートメントが間違っています。 – Henrik

+0

これは魅力的なように機能します...ソリューションが非常に単純な場合もあります。私は同様のアプローチをしていましたが、動かすことができませんでした。どうもありがとうございます...時には私は木の木が見えません。 – hegoe

2

にスレッドから直接サブクラス化することができ、これを使用します。

th = Thread(target=some_func) 
th.daemon = True 
th.start() 

これをThreadから派生させたものと比較すると、スレッドのパブリック関数のすべてを独自のパブリック関数としてエクスポートしないという利点があります。実際には、このコードを使用するクラスを作成する必要はありません。self.functionまたはglobal_functionは、両方ともtargetと同じように使用できます。

コンテキストマネージャを使用してスレッドを開始/停止することも考えます。そうしないと、スレッドが必要以上に長く生き残り、シャットダウン時にリソースのリークやエラーが発生する可能性があります。これをクラスに入れているので、__enter__にスレッドを開始し、__exit__に参加してください。

関連する問題