2011-09-16 8 views
14

मुझे कक्षा पर्यवेक्षक के कई धागे चलाने की जरूरत है क्योंकि सूची डर्लिस्ट में तत्व हैं। जब मैं इसे पायथन कंसोल चलाता हूं तो यह ठीक काम करता है।"रनटाइम त्रुटि: थ्रेड .__ init __() को थ्रेडिंग के उपclassing नहीं कहा जाता है। पढ़ें

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

लेकिन जब मैं एक मास्टर धागा जो ऑब्जर्वर धागे मैं त्रुटियों मिल अंडे देने के लिए माना जाता है से यह करने के लिए प्रयास करें। में

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

त्रुटि के रूप में Thread .__ init__ को कॉल करने के बारे में कैसे कहा गया? – JBernardo

+0

'd में self.dirlist' होना चाहिए: '। जैसा कि है, 'डर्लिस्ट में डी के लिए:' एक वैश्विक को संदर्भित करता है। उचित [नमूना] (http://sscce.org/) होने के लिए, कोड पूरा होना चाहिए, जिसका अर्थ है कि इसे 'पर्यवेक्षक' का न्यूनतम कार्यान्वयन प्रदान करना चाहिए, और केवल कोड होना चाहिए ताकि इसे सीधे उपयोग किया जा सके (जो कि मतलब है कि दुभाषिया से पायथन प्रॉम्प्ट और इंडेंटेशन की प्रतिलिपि न लें)। नमूना को ठीक करने के लिए अपना प्रश्न संपादित करें। आखिरकार, पाइथन का कौन सा संस्करण आप काम कर रहे हैं? – outis

उत्तर

3

त्रुटि स्पष्ट है, आप thread.__init__() बुलाना चाहिए:

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

'सुपर' कॉल गलत है। आपको सबक्लास पास करना होगा। – delnan

+0

यह काम करता है जब मैंने मास्टर में __init__ को हटा दिया। – Nullpoet

+0

@ नलपेट, इसे 'थ्रेड .__ 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

@ नलपेट: "अभी भी काम नहीं करता है" एक त्रुटि संदेश नहीं है। नया कोड और नई त्रुटि दिखाने के लिए अपना प्रश्न अपडेट करें! – SingleNegationElimination

6

खैर मुझे पता है यह जवाब देने के लिए देर हो चुकी है, लेकिन , क्या है, मैं अजगर में नौसिखिया हूँ लेकिन यह वही बात मेरे साथ हो रही थी, इसलिए मैं पाइथन ट्यूटोरियल पढ़ने के लिए वापस चला गया और इसमें कुछ अंतर हैं जो हम दोनों कोशिश कर रहे हैं, उम्मीद है कि यह मदद करता है। इस

import threading 

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

वर्ग के बजाय अजगर ट्यूटोरियल के अनुसार:

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

और वह काम करना चाहिए, कम से कम मेरे लिए काम करते हैं। मुझे आशा है कि यह सहायक होगा।

और अपने दूसरे सेट पद्धति का उपयोग करके कोशिश, काम करता है क्योंकि आप

init method

थ्रेड से

इसलिए माता-पिता वर्ग से मूल init विधि इसे चलाता के रूप में यह अपेक्षा की जाती है प्रयोग किया जाता है अधिभावी नहीं कर रहे हैं।

संबंधित मुद्दे