添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

6 人关注

我建立了一个通过多线程启动XX次的搜刮器(worker)(通过Jupyter Notebook, python 2.7, anaconda)。 脚本的格式如下,如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()

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

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

I tried:

  • setting all the variables to None
  • setting sleep(30) at end of each iteration (in case it takes time for ram to release)
  • 但似乎没有任何帮助。 有什么办法可以让我在While语句中每次运行后清除内存? 如果没有,有没有更好的方法来执行我的脚本XX次,而又不占用内存?

    预先感谢你。

    3 个评论
    我还试着导入垃圾收集模块(import gc gc.enable()),并在每个工作函数运行后手动添加gc.collect()...没有结果。
    谢谢你给我指明了正确的方向(使用mem profiler)。这个软件包中的逐行分析看起来不错,但是,由于某种原因,我无法安装它。是否有其他软件包提供逐行mem分析?
    python
    multithreading
    memory-leaks
    jupyter-notebook
    FlyingZebra1
    FlyingZebra1
    发布于 2017-12-23
    1 个回答
    FlyingZebra1
    FlyingZebra1
    发布于 2017-12-24
    已采纳
    0 人赞同

    TL;DR 解决办法。确保在每个函数的结尾都有return,以确保所有的局部变量都从ram**销毁。

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

    实施相当简单。

    from pympler.tracker import SummaryTracker
    tracker = SummaryTracker()
    ~~~~~~~~~YOUR CODE
    tracker.print_diff()
    

    追踪器给出了一个很好的输出,这使得由函数产生的局部变量没有被销毁的情况很明显。

    添加"return"在每个函数的结尾处固定了这个问题。