在一个更大的python程序中,我注意到与线程相关的内存泄漏并检查multiprocessing SyncManager队列的大小(也许还有其他操作?)。
在程序中,定时线程就像一个监视器,并报告队列的大小(我们可以决定是否需要启动其他工作人员......)。
我把代码简化为下面的小脚本,演示了这个问题(包括python2和python3)。从我所知道的,似乎当进行.qsize()调用时,它必须分配一些内存,然后在该线程退出时不会被清除?
我的代码中是否存在明显的缺陷,或者这只是一个"不要在一个帖子中执行此操作"?
我确实注意到Thread safety of proxies -- to protect with a lock.但是我觉得这不是真的。
以下是展示行为的示例程序。
#!/usr/bin/env python
import time
import threading
import resource
from multiprocessing.managers import SyncManager
def threadCheckSize():
# apparently calling this in a thread that will soon be going away causes memory leaks?
worker_queue.qsize()
manager = SyncManager()
manager.start()
worker_queue = manager.Queue()
print('Starting test!')
last_time = time.time() - 20
while True:
if time.time() > last_time + 10:
print('Memory usage: %s (kb)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
last_time = time.time()
my_timer = threading.Thread(target=threadCheckSize)
my_timer.daemon = True
my_timer.start()
my_timer.join()