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

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

我构建了一个通过多线程(通过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 = 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分析?