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)
小智 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方法,它按照预期运行.
错误很明显,您应该致电thread.__init__():
def __init__(self, dirlist):
super(Master, self).__init__()
self.dirlist = dirlist
Run Code Online (Sandbox Code Playgroud)