8

クラスがインスタンス化されるとすぐに新しいスレッドでそのメソッドの1つを開始する方法を探す/グーグルするのに最後の1時間(s???)を費やしました。

次のようなものを実行できます。

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...

4

2 に答える 2

2

スレッドで関数 (またはメンバー関数) を実行するには、次のようにします。

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

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

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

于 2013-08-24T13:02:24.517 に答える