Python - 检查瞬态线程中多处理SyncManager队列的大小时发生内存泄漏

时间:2015-02-18 17:47:42

标签: python memory-leaks multiprocessing python-multiprocessing

在一个更大的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()

0 个答案:

没有答案