【问题标题】:Perl and Process ManagementPerl 和进程管理
【发布时间】:2012-01-07 08:05:08
【问题描述】:

我正在使用 Perl 开发一个相当大的企业应用程序,有数十个模块等,主要用于在网络上抓取一些东西。

我编写的子程序之一是进行图像检索和分析。对于我发送给它的每个参数,通常需要几秒钟才能完成。所以我将它发送到不同的进程(分叉......)。问题是,一段时间后系统变得非常不稳定,内存已满。

问题

  1. 是不是因为创建的每个进程都会在单独的内存位置创建父数据的副本?如果是这样,这是否意味着每个孩子都拥有所有模块的副本? (而且有几十个……)
  2. 释放此内存/管理这些进程的最佳方法是什么?

【问题讨论】:

    标签: perl memory process parallel-processing ipc


    【解决方案1】:

    分叉使用copy-on-write,因此分叉的进程不应占用太多内存,除非它们的寿命特别长。

    听起来您的系统出现了内存泄漏。您是否有任何相互递归的依赖关系或循环数据结构?如果是这样,您可能需要考虑使用Scalar::Util::weaken 来调整数据结构上的引用计数。

    【讨论】:

    • 我会调查一下,另外,我在没有任何 sig 处理程序的情况下使用 'exit 0' 退出每个子进程中的进程,稍后当我检查 ps 时,我看到很多 perl 僵尸进程,很多很多,甚至几十/百分之一,正常吗?
    • 您需要在您的子进程上wait 以接收其退出状态,否则它们将作为僵尸继续存在。您可能想查看类似 Parallel::ForkManager 的内容,它会为您处理这些详细信息。
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多