Python多线程 - 使用While语句运行时未释放内存
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多线程 - 使用While语句运行时未释放内存相关的知识,希望对你有一定的参考价值。
我通过多线程(通过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()
内存随每次迭代而建立,最终系统开始将其写入磁盘。
有没有办法在每次运行后清除内存?
我试过了:
- 将所有变量设置为无
- 在每次迭代结束时设置
sleep(30)
(如果ram释放需要时间)
似乎没有任何帮助。关于在While语句中每次运行后我还可以尝试清除内存的其他任何想法?如果没有,有没有更好的方法来执行我的脚本XX次,那不会吃掉公羊?
先感谢您。
TL; DR解决方案:确保使用return返回每个函数以确保所有局部变量都从ram中销毁**
Per Pavel的建议,我使用了内存跟踪器(不幸的是,建议的mem跟踪器对我没用,所以我使用了Pympler。)
实施相当简单:
from pympler.tracker import SummaryTracker
tracker = SummaryTracker()
~~~~~~~~~YOUR CODE
tracker.print_diff()
跟踪器给出了一个很好的输出,这很明显,函数生成的局部变量没有被破坏。
在每个函数的末尾添加“return”修复了问题。
带走: 如果您正在编写一个处理info /生成局部变量的函数,但是没有将局部变量传递给其他任何东西 - >确保使用return返回该函数。这将防止您在内存泄漏时遇到的任何问题。
关于内存使用和BeautifulSoup的其他说明:如果你使用的是带有多线程和多个工作者的BeautifulSoup / BS4,并且只有有限的免费ram,你也可以在完成后使用soup.decompose()
来破坏汤变量,而不是等待返回/代码停止运行的函数。
以上是关于Python多线程 - 使用While语句运行时未释放内存的主要内容,如果未能解决你的问题,请参考以下文章
如何多线程(多进程)加速while循环(语言-python)?