首页 > 解决方案 > Python中具有多线程和进程的复杂程序中的内存错误调试

问题描述

我正在努力调试复杂程序中的内存使用/泄漏问题,该程序广泛使用线程和多处理(例如,数千个并发线程和数十个(或可能数百个)并发进程)。

A. 我曾尝试运行memory_profiler以希望获得逐行输出,但它似乎在程序完成之前不会产生此输出。我遇到了两个问题:

(i) 我的程序设计为无限期运行。我已经尝试了一些简单的修改来在某个点之后结束我的程序(至少在主进程/线程中),但是子线程和进程继续运行,所以我没有得到 memory_profiler 输出。

(ii) 因为子线程和进程继续运行,如 (i) 中所述,在我看来,我需要进行相当重要的重新设计,以使子线程和进程在主线程/进程停止时停止. (我一直在考虑创建一个全局变量以用作线程中的停止标志,并使用多处理状态共享功能与子进程共享该停止标志,但我怀疑我的方法是错误的/不必要的复杂)。

B. 我尝试过 objgraph(此处引用:https ://benbernardblog.com/tracking-down-a-freaky-python-memory-leak/ ),它允许我在程序运行时打印内存使用情况和增长表(例如,使用objgraph.show_most_common_types() 和 objgraph.show_growth())。但是,我发现输出没有帮助。它基本上告诉我列表中有 60 gb 的数据,但我没有看到一种方法可以逐个变量、逐个线程和/或逐个进程地分解这些信息。

我有以下问题:

  1. 关于 memory_profiler:

    (i) 有没有办法在程序运行完成的情况下获得 memory_profiler 的逐行输出?

    (ii) 有没有一种方法可以杀死子线程和进程,而无需遵循我在上面 (A)(ii) 中建议的复杂路径?

  2. 有没有办法从 objgraph 获取有关内存使用情况的更详细信息?

  3. 我使用 PyCharm 作为我的 IDE,并且熟悉其用于速度分析的分析功能,但我在其分析功能中看不到任何内存分析。我错过了吗?

  4. 有没有比我上面提到的更好/更容易使用的内存分析工具来调试 Python 脚本?我对免费和付费选项持开放态度。

  5. 是否有一种相对简单的方法来计算我跨不同线程和进程(即全局)启动了多少线程和进程?我在特定线程/进程中使用了多处理is_alive()和线程isAlive()函数。但是,我没有看到一种相对简单的方法来计算全局线程和进程的数量,而无需使用队列、全局变量和状态共享来实现整个框架来计算该信息(仅用于调试)。

  6. 也许这是一个过于宽泛的问题,但我是否会错误地进行内存使用调试?如果是这样,您对不同的技术(或说明不同技术的来源)有建议吗?

标签: python-3.xmultithreadingmemory-managementmultiprocessing

解决方案


推荐阅读