我需要运行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()
答案 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方法的第二次尝试有效,因为你没有覆盖
因此,来自Thread的init 方法
使用来自父类的原始init方法,它按照预期运行。
答案 2 :(得分:3)
错误很明显,您应该致电thread.__init__()
:
def __init__(self, dirlist):
super(Master, self).__init__()
self.dirlist = dirlist