python threads can only be started once
发布网友
发布时间:2022-04-22 23:41
我来回答
共4个回答
热心网友
时间:2022-05-01 20:19
python "threads can only be started once"解决方法
import threadingimport timeclass Thread(threading.Thread):
def __init__(self, i):
threading.Thread.__init__(self)
self.name = 'crawlers - ' + str(i+1) def run(self):
print 'test --- ' + self.name # do somethingclass Controller(threading.Thread):
def __init__(self, threads):
threading.Thread.__init__(self)
self.daemon = True
self.threadList = threads def run(self):
for each in self.threadList:
each.start() while True: for a in xrange(5): if not self.threadList[a].isAlive():
self.threadList[a].start()
sleep(3600) # 每个小时判断一下if __name__ == '__main__':
threads = [] for i in xrange(5):
t = Thread(i)
threads.append(t)
c = Controller(threads)
c.start()
c.join()
所以我就写了如上的代码,结果,报错了:
RuntimeError: threads can only be started once
what???仔细检查代码没有问题,应该是线程结束了以后才重新 start 的,难道要手动结束线程?尝试了一下,好像不对劲,并没有这个概念。
查找python API,结果才发现了问题:
原来是自己没弄清楚,所以解决办法也就很清晰了,重新创建一个对象:
def run(self):
for each in self.threadList:
each.start() while True: for a in xrange(5): if not self.threadList[a].isAlive():
self.threadList[a] = Thread(a)
self.threadList[a].start()
sleep(3600) # 每个小时判断一下
那会不会出现这样一个问题,过去的对象不断占用内存?
答案是不会的,因为python的自动垃圾回收机制,如果一个对象不存在对它的引用,那么它将被回收掉。所以上面的方法是可以解决的。
热心网友
时间:2022-05-01 21:37
出现RuntimeError: threads can only be started once是因为你要启动的这个进程已经在执行了,无法再次启动它
热心网友
时间:2022-05-01 23:11
第一行第二行互换试试。
热心网友
时间:2022-05-02 01:03
意思是说python线程只可以开始一次???你把你程序我看看