Python多线程-使用While语句运行时未释放内存
我构建了一个通过多线程(通过Jupyter笔记本、python 2.7、anaconda)启动XX次的scraper(worker)。 脚本的格式如下,如python.org上所述:Python多线程-使用While语句运行时未释放内存,python,multithreading,memory-leaks,jupyter-notebook,Python,Multithreading,Memory Leaks,Jupyter Notebook,我构建了一个通过多线程(通过Jupyter笔记本、python 2.7、anaconda)启动XX次的scraper(worker)。 脚本的格式如下,如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 = Thr
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()
def多线程_脚本():
我的脚本#上面的代码
x=0
而xTL;DR解决方案:确保每个函数都以return结束,以确保从ram中销毁所有局部变量**
根据Pavel的建议,我使用了memory tracker(不幸的是,我建议mem tracker对我不起作用,所以我使用了)
实施相当简单:
from pympler.tracker import SummaryTracker
tracker = SummaryTracker()
~~~~~~~~~YOUR CODE
tracker.print_diff()
跟踪器提供了一个很好的输出,这使得函数生成的局部变量显然没有被破坏
在每个函数末尾添加“return”修复了该问题
外卖:
如果您正在编写一个处理信息/生成局部变量的函数,但不将局部变量传递给任何其他对象->请确保以return结束函数。这将防止您可能遇到的内存泄漏问题
关于内存使用和美化的附加说明组:
如果您使用的BeautifulSoup/BS4具有多线程和多个工作线程,并且可用ram数量有限,那么也可以在使用完soup变量后立即使用soup.decompose()
销毁它,而不是等待函数返回/code停止运行。我还尝试导入垃圾收集模块(导入gc.enable()),并在每个辅助函数运行后手动添加gc.collect()。不用了。感谢您为我指明了正确的方向(使用mem profiler)。此软件包中的逐行分析看起来不错,但由于某些原因,我无法安装它。是否有其他软件包提供逐行mem分析?