2011-09-16 20 views
14

リストdirlistの要素と同じ数のObserverクラスのスレッドを実行する必要があります。 私はPythonコンソールを実行すると大丈夫です。Threading.Threadをサブクラス化するときにRuntimeError:thread .__ init __()が呼び出されない

しかし、Observerスレッドを生成するマスタスレッドからこのスレッドを実行しようとすると、エラーが発生します。中

class Master(Thread): 
    def __init__(self, dirlist): 
     self.dirlist = dirlist 
    def run(self): 
     observers = {} 
     for d in dirlist: 
      observers[d] = Observer() 
      observers[d].start() 
     while True: 
      time.sleep(3600) 

master_thread = Master(dirlist) 
master_thread.start() 

Master.start結果への呼び出し:

RuntimeError: thread.__init__() not called

これは私には奇妙に見えます。
私は両者の違いを理解できません。
誰かが私の問題の解決策を見つけ出すことができますか?

どういうわけか、次のようなエラーは発生しません。理由はわかりません。

class Master(Thread): 
    def set(self, dirlist): 
     self.dirlist = dirlist 
    def run(self): 
     observers = {} 
     for d in dirlist: 
      observers[d] = Observer() 
      observers[d].start() 
     while True: 
      time.sleep(3600) 

master_thread = Master() 
master_thread.set(dirlist) 
master_thread.start() 
+6

スレッドについて.__ init__はエラーと言われましたか? – JBernardo

+0

'for d in self.dirlist:'にする必要があります。それがそうであるように、 'dのdirlist:'はグローバルを指します。適切な[サンプル](http://sscce.org/)になるためには、コードは完全でなければなりません。つまり、Observerの実装を最小限にする必要があります。 Pythonプロンプトとインデントをインタプリタからコピーしないことを意味します)。サンプルを修正するために質問を編集してください。最後に、どのバージョンのPythonを使用していますか? – outis

答えて

3

エラーがクリアされている、あなたはthread.__init__()を呼び出す必要があります:

def __init__(self, dirlist): 
    super(Master, self).__init__() 
    self.dirlist = dirlist  
+3

'super'呼び出しが正しくありません。あなたはサブクラスを渡すことになっています。 – delnan

+0

Masterで__init__を削除したときの動作です。 – Nullpoet

+0

@ Nullpoet、 'Thread .__ init__'を呼び出すとうまくいくはずです。それ以外の問題がないことを確認してください。そして、initなしでdirlistパラメータを使うことはできません。 – utdemir

30
>>> master_thread.start() 
RuntimeError: thread.__init__() not called 

Thread.__init__()を呼び出すようにしてくださいあなたのMaster.__init__

class Master(Thread): 
    def __init__(self, dirlist): 
     super(Master, self).__init__() 
     self.dirlist = dirlist 
+0

まだ動作しません。 – Nullpoet

+3

@ Nullpoet: "まだ動作しません"エラーメッセージはあまりありません。あなたの質問を更新して、新しいコードと新しいエラーを表示してください! – SingleNegationElimination

6

まあ、私はそれが答えることは遅れて知っているが、何が、私はpythonで初心者ですが、この同じことが私に起こっていたので、私はPythonチュートリアルを読むために戻ってきました。そして、私たちが試みていることとはいくつかの違いがあります。

class Master(threading.Thread): 

この行が欠落しています:

threading.Thread.__init__(self) 

はそれがになってしまうでしょう。

import threading 

class Master(threading.Thread): 
def __init__(self, dirlist): 
    threading.Thread.__init__(self) 
    self.dirlist = dirlist 
def run(self): 
    observers = {} 
    for d in dirlist 
    ... 
Pythonのチュートリアルに従って、代わりにこの

import threading 

class Master(Thread): 
def set(self, dirlist): 
    self.dirlist = dirlist 
def run(self): 
    observers = {} 
    for d in dirlist 
    ... 

クラスの

と少なくとも私のために働く必要があります。 役に立ったと思う。

そして、あなたはそのため親クラスから元のinitメソッドは、それがはずの通りに実行されます使用されているスレッドから

init method

を上書きされないため、setメソッドを使用して、2回目の試行は、動作します。

関連する問題