Python - 如何正确终止 threading.Timer 类?
我现在在尝试使用 threading.Timer,但似乎进展不太顺利。我的目标是让数百个函数不断重复运行。问题是,我的内存使用量一直在增加,直到程序停止。
我的代码大概是这样的:
from threading import Timer
class Foo:
def __init__(self, number):
self.number = number
self.timer = Timer(1, self.print_number)
self.timer.start()
def print_number(self):
print "Number: %s"%self.number
self.repeat()
def repeat(self):
self.timer.cancel()
#self.timer.join()
#time.sleep(1)
self.timer = Timer(3, self.print_number)
self.timer.start()
for x in range(1, 300):
Foo(x)
我看到有人说可以在调用 .cancel() 后,用 .join() 方法来终止一个线程。但是当我这么做的时候,出现了一个错误:RuntimeError: (cannot join current thread)
。我还听说在 .cancel() 后可以用 time.sleep 来终止线程,但对我来说,这样做并没有效果。
我想问的是:在这个代码示例中,我该如何正确终止线程?还有,怎样才能阻止脚本继续占用越来越多的内存?或者说我是不是做错了什么?
抱歉如果我问了一个已经被问过很多次的问题,但我搜索了很久还是找不到解决办法。
提前感谢大家的帮助。
1 个回答
0
像这样吗?在循环中设置一个结束条件就行了。最后的连接操作确保所有线程都完成后再继续进行。我经常和队列一起使用这个(你可以找一些示例,比如队列工作任务模式或者类似的搜索)。
另外,当我只需要定时运行某些任务或者实现类似定时任务的功能时,我会使用apscheduler。
import threading
import time
WORKERS = 300
class Worker(threading.Thread):
def __init__(self, number):
self.number = number
threading.Thread.__init__(self)
def run(self):
while 1:
if self.number > 300:
break
print "Number: %s"%self.number
self.number += 1
time.sleep(3)
workers = []
for i in range(WORKERS):
w = Worker(100)
workers.append(w)
w.start()
for w in workers:
w.join()