“子类化threading.Thread时,”runtimeError:thread .__ init __()未被调用

时间:2011-09-16 13:52:48

标签: python multithreading

我需要运行Observer类的多个线程,因为list dirlist中有元素。 当我运行python控制台时,它可以正常工作。

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

但是当我尝试从一个应该生成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()

3 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:9)

嗯,我知道现在回答已经很晚了,但到底是什么,我是python的新手,但同样的事情发生在我身上,所以我回去阅读python教程,它与我们俩有一些不同之处'尝试,希望它有所帮助。 而不是这个

import threading

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

类根据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
    ...

这应该有用,至少对我有用。 我希望它有用。

使用set方法的第二次尝试有效,因为你没有覆盖

  

init 方法

因此,来自Thread的

使用来自父类的原始init方法,它按照预期运行。

答案 2 :(得分:3)

错误很明显,您应该致电thread.__init__()

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