【问题标题】:How can I spawn a long running process in a Perl CGI script?如何在 Perl CGI 脚本中生成长时间运行的进程?
【发布时间】:2011-03-13 08:13:37
【问题描述】:

我现在正在编写一个 Perl CGI 脚本,但它正在成为一个资源占用者,并且它不断被我的网络主机杀死,因为我不断达到我的进程内存限制。我想知道是否有一种方法可以将我拥有的脚本拆分为多个脚本,然后让第一个脚本调用下一个脚本然后退出,这样整个脚本就不会一次在内存中。我看到有一个导出器模块,但我不知道如何使用它,因为我刚刚学习 Perl,我认为这不能解决我的内存问题,但我可能错了。

【问题讨论】:

  • 你需要更多关于你的脚本在做什么的信息,或者更重要的是,一个代码示例。如果您可以启动/链接一个不太密集的新进程,那么您可以释放当前进程中的内存。

标签: perl memory scripting cgi process


【解决方案1】:

Watching long processes through CGI

另一方面,更好地管理内存也可能解决您的问题。例如,如果您一次将整个文件读入内存,请尝试编写脚本,以便它逐行或以固定大小的块处理数据。在尽可能小的范围内声明变量。

尝试确定脚本的哪一部分造成了最大的内存占用,并将相关摘录发布在单独的问题中以获取更多内存管理建议。

【讨论】:

    【解决方案2】:

    如果适用,使计算/生成离线。

    创建一个守护进程或一个计划的作业来创建结果的静态版本,守护进程可以在事件(例如文件修改)或设定的时间间隔内创建结果的新版本。

    如果您根据客户端输入生成页面,请考虑分离逻辑,以便可以缓存至少部分应用程序。

    旁注,除非它适合您的需要,否则我会完全放弃 CGI,并查看 mod_perlfastcgi,您可以在其中使用持久的 perl 进程来处理请求,从而节省分叉新的 perl 解释器的开销,加载模块等。

    【讨论】:

      【解决方案3】:

      是的,您可以从 perl 脚本启动另一个 perl 脚本,然后退出调用脚本:

      http://perldoc.perl.org/functions/fork.html

      示例代码:

      #!/usr/bin/perl
      
      my $pid = fork();
      if (not defined $pid) {
          print "resources not avilable.\n";
      } elsif ($pid == 0) {
          print "IM THE CHILD\n";
          sleep 5;
          print "IM THE CHILD2\n";
          exit(0);
      } else {
          print "IM THE PARENT\n";
          waitpid($pid, 0);
      }
      print "HIYA\n";
      

      但是,如果您希望第二个脚本能够使用 CGI 与您的网络服务器/用户进行通信,这将不起作用。如果您将 perl 脚本作为 CGI 运行,那么它必须将结果返回给用户。

      所以你有两种方法来处理这个问题:

      • 尝试找出为什么要使用这么多内存并改进脚本。

      • 如果实在没有办法减少内存消耗,你可以使用守护进程 perl 脚本作为工作进程,它会进行计算并将结果返回给你的 CGI-perl 脚本,等待结果再终止。

      【讨论】:

      • 使用fork(),您现在已经加载了程序的两个副本(包括程序在fork 之前加载的所有数据)。这将如何减少脚本的内存占用?
      • 实际上它确实有效,因为子进程从父进程继承了打开的文件描述符,所以当子进程写入标准输出时,它将转到与父进程相同的标准输出,即网络服务器打开的管道使用 cgi 脚本。
      • fork() 生成一个自运行的独立进程(en.wikipedia.org/wiki/Fork_%28operating_system%29)。您可以使用 fork 启动不同的脚本,因此每个部分都比完整部分更小。然后,您必须管理所有进程之间的数据更改 - 没有人说这很简单 :)
      • 除非您执行 fork() && exec() 子进程将拥有父进程内存的副本。所以你应该在程序的早期 fork()。
      猜你喜欢
      • 2015-05-27
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多