python3 Timer 内存泄漏
发现我如下使用Timer会出现内存泄漏,程序运行起来,内存使用量快速增加,不会减少。这段代码在tkinter界面中,若用tkinter.after将Timer替换,内存泄漏就不存在了。如何使用Timer才是正确的姿势?谢谢!
from threading import Timer, Thread
from queue import Queue
import time
def opWork():
while True:
if not opQueue.empty():
opQueue.get()
print(" -------------- pocess a cmd!")
else:
time.sleep(0.001)
def tickOff():
opQueue.put("cmd")
global tick
tick.cancel()
tick = Timer(0.001, tickOff)
tick.start()
print("add a cmd! -------------- ")
tick = Timer(0.001, tickOff)
if __name__ == "__main__":
opQueue = Queue()
worker = Thread(target=opWork)
worker.start()
tick.start()
是python本身的bug吗?刚找到这个 [issue43050] threading timer memory leak
问题代码如下:
While True:
timer = threading.Timer(5, None)
timer.start()
timer.cancel()
我试了,内存快速增加,不会减少。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
通过测试
while True: timer.start&cancel&join
, threading.Timer 确实存在内存泄露。查看 threading.Timer 的实现,它本质上是 thread, 即使不存在内存泄露,这么高频繁地创建/销毁thread, 带来的cpu开销也很大;
同时 Queue(maxsize) 要设定个最大值避免queue无限堆积,或者使用 collections.deque, 不过 queue.get(block: bool) 可以设置是否block (也因此get前不用判断是否empty, 也不用 sleep); deque.get() 是 non-blocking, 需要使用threading.condition来避免 busy loop.
题主可能真正需要的是一个 ticker,使用一个线程就够用了
tick = Timer(0.001, tickOff) 自己在调自己 无限递归