线程对象未从内存中释放

时间:2017-12-28 13:06:29

标签: multithreading python-3.x memory

我编写了一个连续脚本,每隔几秒钟从互联网上收集一些数据,将其保留在内存中一段时间​​,定期将其全部存储到数据库然后将其删除。为了保证一切顺利运行,我使用线程同时从多个源收集数据。为了最小化数据库操作并避免与其他数据库进程冲突,我只是偶尔写。

永远不会返回已删除变量的内存,并最终变得如此之大,以至于脚本崩溃(由tracemalloc和pympler显示)。我想我正在处理错误的线程数据,但我不知道如何以不同的方式做到这一点。下面的最小例子。

另外:我不认为我可以使用队列,因为实际上有多个函数从这一点开始,修改不同的局部变量。

import threading
import time
import tracemalloc
import pympler.muppy, pympler.summary
import gc

tracemalloc.start()

def a():
    # collect data
    collection.update({int(time.time()): list(range(1,1000))})
    return

collection = {}
threads = []
start = time.time()
cycle = 0

while time.time() < start + 60:
    cycle += 1
    t = threading.Thread(target = a)
    threads.append(t)
    t.start()
    time.sleep(1)
    for t in threads:
        if t.is_alive() == False:
            t.join()

    # periodically delete data
    delete = []
    for key, val in collection.items():
        if key < time.time() - 10:
            delete.append(key)
    for delet in delete:
        print('DELETING:', delet)
        del collection[delet]

    gc.collect()
    print('CYCLE:', cycle, 'THREADS:', threading.active_count(), 'COLLECTION:', len(collection))
    print(tracemalloc.get_traced_memory())
    all_objects = pympler.muppy.get_objects()
    sum1 = pympler.summary.summarize(all_objects)
    pympler.summary.print_(sum1)

0 个答案:

没有答案