2011-09-16 27 views
14

Liste dizinindeki öğeler olduğundan, sınıf Observer'ın birçok iş parçacığını çalıştırmam gerekiyor. Python konsolunu çalıştırdığımda her şey yolunda gider."RuntimeError: thread .__ init __()" alt sınıflama iş parçacığı olarak adlandırılırken .Thread

class Observer(Thread): 
    def run(self): 
     naptime = random.randint(1,10) 
     print(self.name + ' starting, running for %ss.' % naptime) 
     time.sleep(naptime) 
     print(self.name + ' done') 

observers = {} 
for d in dirlist: 
    observers[d] = Observer() 
    observers[d].start() 

Ama hataları olsun Gözlemci konuları yumurtlamaya gerekiyordu Master iplikten bunu çalıştığınızda. içinde

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() 

çağrı Master.start için sonuçlar:

RuntimeError: thread.__init__() not called

Bu bana garip görünüyor.
Her iki durum arasındaki farkın ne olduğunu anlayamıyorum.
Sorunumu çözen biri var mı?

Bir şekilde takip etme, bir hata oluşturmuyor ve nedenini anlamıyorum.

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

Thread .__ init__ hatası nasıl denir? – JBernardo

+0

: "self.dirlist" için "d" olmalıdır. Olduğu gibi, 'd için dlist:' bir global ifade eder. Uygun bir [örnek] (http://sscce.org/) olmak için, kod tamamlanmalıdır, yani 'Gözlemcinin' minimal bir şekilde uygulanmasını sağlamalı ve sadece kod kullanılmalıdır (python komutunu ve girintiyi tercümandan kopyalamayın). Örneği düzeltmek için sorunuzu düzenleyin. Son olarak, hangi Python sürümü ile çalışıyorsunuz? – outis

cevap

3

Hata açıktır, sen thread.__init__() çağırmalıdır:

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

'Süper 'çağrısı yanlış. Alt sınıfı geçmek zorundasın. – delnan

+0

Usta'da __init__'yi kaldırdığımda çalışıyorum. – Nullpoet

+0

@Nullpoet, 'Thread .__ init__' ile çalışmak gerekir. Başka bir problem olmadığından emin olun. Ve init olmadan dirlist parametresini kullanamazsınız. – utdemir

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

yılında Thread.__init__() aramak emin olun sizin Master.__init__:

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

Hala çalışmıyor. – Nullpoet

+3

@Nullpoet: "Hala çalışmıyor" Çok fazla hata mesajı yok. Yeni kodu ve yeni hatayı göstermek için sorunuzu güncelleyin! – SingleNegationElimination

6

Eh ben cevap geç olduğunu biliyorum ama Ne cehennemde pythonda bir acemi ama aynı şey bana oluyordu, ben de python öğreticisini okumak için geri döndü ve ikimizin de denediğimiz şeyle bazı farklılıkları var, umarım yardımcı olur.

class Master(threading.Thread): 

bu satırı eksik:

threading.Thread.__init__(self) 

yüzden varlık sona erecek:

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 
    ... 
piton öğretici göre yerine bu

import threading 

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

sınıfın

ve Çalışmalı, en azından benim için çalışmalı. Umarım yardımcı olur.

Ve bu nedenle ana sınıfından orijinal init yöntemi gerekiyordu gibi çalışır kullanıldığı Konu den

init method

geçersiz olmadığı için ayarlama yöntemini kullanarak ikinci denemeydi çalışır.

İlgili konular