python-3.x - 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 的数据,但我没有看到一种方法可以逐个变量、逐个线程和/或逐个进程地分解这些信息。
我有以下问题:
关于 memory_profiler:
(i) 有没有办法在程序运行完成的情况下获得 memory_profiler 的逐行输出?
(ii) 有没有一种方法可以杀死子线程和进程,而无需遵循我在上面 (A)(ii) 中建议的复杂路径?
有没有办法从 objgraph 获取有关内存使用情况的更详细信息?
我使用 PyCharm 作为我的 IDE,并且熟悉其用于速度分析的分析功能,但我在其分析功能中看不到任何内存分析。我错过了吗?
有没有比我上面提到的更好/更容易使用的内存分析工具来调试 Python 脚本?我对免费和付费选项持开放态度。
是否有一种相对简单的方法来计算我跨不同线程和进程(即全局)启动了多少线程和进程?我在特定线程/进程中使用了多处理is_alive()和线程isAlive()函数。但是,我没有看到一种相对简单的方法来计算全局线程和进程的数量,而无需使用队列、全局变量和状态共享来实现整个框架来计算该信息(仅用于调试)。
也许这是一个过于宽泛的问题,但我是否会错误地进行内存使用调试?如果是这样,您对不同的技术(或说明不同技术的来源)有建议吗?
解决方案
推荐阅读
- build - 哪种方式更好地创建 deb 文件?
- gtk - 我是否在 gtk_text_buffer_get_text 返回时调用 g_free
- reactjs - 反应本机 AsyncStorage 问题
- c++ - 程序在可区分联合的复制构造函数内崩溃
- android - 带有 Flutter 应用程序的 Visual Studio 应用程序中心
- java - 无法将数据库连接到 Java 动态 Web 项目
- javascript - HTTP 请求和响应数据 Content-Type: application/encrypted-json;charset=UTF-8
- ios - 在 Swift5 中获取环境类型
- typo3 - 如何为登录的前端用户临时禁用语音 url?
- python - 当 url 不变时抓取多个页面