2017-05-10 13 views
1

多くの機能(したがってメソッド)を持つクラスを作成していますが、このクラスはスレッド内で実行する必要があります(クラスはサブプロセスを開きます)。私は、私のこのクラスは、多くの擬似プライベート、定期的および静的なメソッドを持って、言ったように、しかしthreading.Threadからのカスタムクラスの継承

class HiStackOverflow(threading.Thread): 
    # Somethings... 

、スレッドベースのクラスを宣言する一般的な方法を使用します。私がそれらを宣言すると、間違っていくつかの必要なメソッドをオーバーライドすることを避けたいと思います。

私はいつもthreading.Threadのディレクトリをチェックして、重複するメソッド名があるかどうかを確認することができますが、これはこれを処理するには不適切な方法のようです。メソッド数が増えると実用的ではないかもしれません。

私の質問は、この種の実装は実現可能ですか?もしそうでなければ、どうすればいいですか?私はスレッドハンドラとしていくつかのラッパークラスを記述する必要があります。

ありがとうございます。

答えて

1

クラスとthreading.Threadの名前空間の衝突が心配な場合は、継承よりも構図を使用することをお勧めします(または、2つの機能を完全に別々にする)。あなたが必要とするカップルのスレッドメソッドをラップするだけで、名前の衝突が問題にならないようにするためには、重大なオーバーヘッドはありません。

また、クラスの機能をスレッド化によって提供される機能から分離することもあります。これは長期的にはあなたのコードを理解する上で勝つ可能性が高いです。

+0

他の回答の解決策を意味しますか? – Rockybilly

+0

@Rockybilly - そうですね、それは私が意味することです:-) - おそらく、クラスの機能とスレッド化を完全に分離しておくことをお勧めします。 'm = MyClass(...);スレッド=スレッド(ターゲット= m.run); thread.start() 'はあまりにも悪くはないようで、論理を単純化し、MyClassの目的を明確にします。 – mgilson

0

Threadから継承してもあまり効果がありません。スレッドを作成するファクトリメソッドを持つこともできますし、を作成することもできます。

import threading 
import time 

class MyClass: 

    def __init__(self): 
     self._thread = threading.Thread(target=self.run) 
     self._thread.start() 

    def run(self): 
     for i in range(5): 
      print('worker thread', i) 
      time.sleep(.5) 

    def join(self): 
     self._thread.join() 

my_obj = MyClass() 
for i in range(3): 
    print('main thread', i) 
    time.sleep(.5) 
my_obj.join() 
print('done') 
0

はこのフレーズに融合し、いくつかのアイデアがあるように思える:

が、私は、スレッド内で実行するには、このクラスを必要と

  1. クラス(クラスは、サブプロセスを開きます)実行しないでください。いくつかのクラスメソッドまたはインスタンスメソッドを実行する新しいスレッドを開始することができます。そのクラスはThreadから継承する必要はありません。実行中のスレッドへの参照は必要ありません。あなたはちょうど新しいスレッドでいくつかの関数を実行し始めると完了です。

  2. サブプロセスはスレッドとは無関係です。もう片方をする必要はありません。

オーバーライドが心配な場合は、ドキュメント(https://docs.python.org/3/library/threading.html#thread-objects)を確認してください。それ以外の場合は、スレッドへの参照を保持する場合は、いつでも行うことができます:

class HiStackoverflow: 
    def run(self): 
     self.thread = Thread(target=self.entry_point) 
     self.thread.start() 

    def entry_point(self): 
     ... 
+0

私が言ったのは、クラスは連続的なサブプロセスを開き、スレッド内で実行するためにサブプロセスが必要でした。誤解をおかけして申し訳ありません。 – Rockybilly

+0

@Rockybillyサブプロセスはスレッド内では実行されません。それらは現在のプロセスの外側で完全に実行されます。 – viraptor

+0

それを実現するにはしばらく時間がかかった、ありがとう。 – Rockybilly