Python多线程 - 使用While语句运行时未释放内存

时间:2017-12-23 09:36:19

标签: python multithreading memory-leaks jupyter-notebook

我通过多线程(通过Jupyter Notebook,python 2.7,anaconda)建立了一个刮刀(工人)XX次。 脚本具有以下格式,如python.org中所述:

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done

当我按原样运行脚本时,没有问题。脚本完成后释放内存。

但是,我想运行上述脚本20次(批处理), 所以我把上面提到的脚本变成了一个函数,并使用下面的代码运行该函数:

def multithreaded_script():
   my script #code from above

x = 0
while x<20:
  x +=1
  multithredaded_script()

每次迭代都会建立内存,最终系统开始将其写入磁盘。

有没有办法在每次运行后清除内存?

我试过了:

  1. 将所有变量设置为无
  2. 在每次迭代结束时设置sleep(30)(如果ram需要时间释放)
  3. 似乎没有任何帮助。 关于在While语句中每次运行后我还可以尝试清除内存的其他任何想法? 如果没有,是否有更好的方法来执行我的脚本XX次,这不会占用公羊?

    提前谢谢。

1 个答案:

答案 0 :(得分:2)

TL; DR 解决方案:确保使用return返回每个函数以确保所有局部变量都从ram中销毁**

Per Pavel的建议,我使用了内存跟踪器(不幸的是,建议的mem跟踪器对我不起作用,所以我使用了Pympler。)

实施相当简单:

from pympler.tracker import SummaryTracker
tracker = SummaryTracker()

~~~~~~~~~YOUR CODE

tracker.print_diff()

跟踪器提供了一个很好的输出,这很明显,函数生成的局部变量没有被破坏。

在每个功能的末尾添加“返回”解决了问题。

<强>外卖:
如果您正在编写一个处理info /生成局部变量的函数,但是没有将局部变量传递给其他任何函数 - &gt;确保以返回结束该功能。这将防止您在内存泄漏时遇到的任何问题。

有关内存使用情况的其他说明&amp; BeautifulSoup: 如果您正在使用具有多线程和多个工作者的BeautifulSoup / BS4,并且具有有限数量的免费ram,您也可以使用soup.decompose()在完成后立即销毁汤变量,而不是等待函数返回/代码停止运行。