【问题标题】:Track variables in Python subprocesses跟踪 Python 子进程中的变量
【发布时间】:2014-08-08 07:03:43
【问题描述】:

我想要一种方法来跟踪 Python 中的子进程如何使用内存。更准确地说,我想获取有关每个子流程使用的变量的信息——它们是主流程变量的副本,还是在多个子流程之间共享等等。

请注意,我对在 Python 中调试子进程的一般技术不感兴趣,我知道有关该主题的大量帖子。我非常想了解有关内存使用情况的更多信息。

【问题讨论】:

    标签: python memory-management subprocess python-multithreading


    【解决方案1】:

    我认为这个答案可以帮助你。 Python Memory Profiler

    例子:

    from guppy import hpy
    h = hpy()
    print h.heap()
    

    结果

    Partition of a set of 132527 objects. Total size = 8301532 bytes.
    Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
    0  35144  27  2140412  26   2140412  26 str
    1  38397  29  1309020  16   3449432  42 tuple
    2    530   0   739856   9   4189288  50 dict (no owner)
    

    此外,还有一个模块,它易于使用,您可以看到操作和变量。

    memory_profiler

    看起来像这样(从包的页面中提取):

    Line #    Mem usage  Increment   Line Contents
    ==============================================
         3                           @profile
         4      5.97 MB    0.00 MB   def my_func():
         5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
         6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
         7     13.61 MB -152.59 MB       del b
         8     13.61 MB    0.00 MB       return a
    

    【讨论】:

    • 这是一个很好的开始,但我想知道是否可以看到变量的实际名称。
    • @JohnJaques 我添加了一些可能对你有帮助的东西,检查一下。
    • 是的,这非常有用!我将在多个子进程上尝试它,看看它的行为如何。
    【解决方案2】:

    一般来说,子进程不与其父进程共享变量。不过,它可能会共享内存页面

    在 POSIX 系统上,Python 通过使用 os.fork() 后跟 os.execvp()os.execvpe() 来启动子进程。 (在 Windows 上它使用 CreateProcess(),但我将专注于 POSIX。)

    fork 之后,子进程是父进程的副本。但与线程不同的是,它们并非按设计共享内存(或变量);它们是单独的过程。分叉的进程确实有其父进程描述符的副本,指向相同的文件。 根据操作系统的虚拟内存管理实现,它们可能使用copy on write(“COW”)共享内存页面。

    然而,不久之后,子进程调用os.execvp 将自己替换另一个程序。 现在这个新程序可能仍然使用 COW 共享一些内存页面,具体取决于上述虚拟内存实现。但它不能使用它所替换的进程中的变量。

    如果您希望子进程成为 Python 函数,则应查看 multiprocessing。在那里你可以share variables between processes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2018-07-25
      • 2011-01-23
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多