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

Nul*_*oet 17 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()
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从一个应该生成Observer线程的Master线程中执行此操作时,我会收到错误.

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()
Run Code Online (Sandbox Code Playgroud)

致电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()
Run Code Online (Sandbox Code Playgroud)

Fer*_*yer 33

>>> master_thread.start()
RuntimeError: thread.__init__() not called
Run Code Online (Sandbox Code Playgroud)

请务必打电话给Thread.__init__()Master.__init__:

class Master(Thread):
    def __init__(self, dirlist):
        super(Master, self).__init__()
        self.dirlist = dirlist
Run Code Online (Sandbox Code Playgroud)

  • @Nullpoet:"仍然无法正常工作"不是一个错误信息.更新您的问题以显示新代码和新错误! (4认同)

小智 9

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

import threading

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

根据python教程分类:

class Master(threading.Thread):
Run Code Online (Sandbox Code Playgroud)

这条线丢失了:

threading.Thread.__init__(self)
Run Code Online (Sandbox Code Playgroud)

所以最终会:

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:
            ...
Run Code Online (Sandbox Code Playgroud)

这应该工作,至少为我工作.我希望它有用.

你的第二次尝试使用set方法是有效的,因为你没有超越

init方法

因此,从Thread中使用来自父类的原始init方法,它按照预期运行.


utd*_*mir 6

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

def __init__(self, dirlist):
    super(Master, self).__init__()
    self.dirlist = dirlist       
Run Code Online (Sandbox Code Playgroud)

  • “super”调用不正确。你应该通过子类。 (3认同)