我没有参与接近操作系统的编程技术,但据我所知,当在Perl中并行执行某些操作时,选择的武器就是fork,可能还有一些基于它的有用模块. fork的doc页面说:
Does a fork(2) system call to create a new process running the same program at the same point.
因此,拥有一个耗费大量内存并为一个小任务调用fork的大型应用程序意味着将有两个大的perl进程,而第二个将浪费资源只是为了做一些简单的工作.
所以,问题是:做什么(或如何使用fork,如果它是唯一的方法),以便让独立的代码部分独立运行并消耗它所需的资源?
只是一个非常简单的例子:
use strict; use warnings; my @big_array = ( 1 .. 2000000 ); # at least 80 MB memory sleep 10; # to have time to inspect easely the memory usage fork(); sleep 10; # to have time to inspect easely the memory usage
并且子进程也消耗80 MB.
要明确:与这个分离的代码进行交流或以某种方式使用其结果并不重要,只是为了可以说“嘿,在后台为我运行这个简单的任务,让我继续我的繁重工作……”不要浪费我的资源!“在运行繁重的perl应用程序时.
解决方法
fork()到exec()是你的兔子.你fork()来创建一个新的进程(这是一个相当便宜的操作,见下文),然后exec()来替换你用较小的东西运行的大perl.这看起来像这样:
use strict; use warnings; use 5.010; my @ary = (1 .. 10_000_000); if (my $pid = fork()) { # parent say "Forked $pid from $$; sleeping"; sleep 1_000; } else { # child exec('perl -e sleep 1_000'); }
(@ary只是用来填补原始进程的内存.)
我说fork()ing相对便宜,即使它复制了整个原始进程.这些陈述没有冲突;设计fork的人注意到了同样的问题.副本是惰性的,也就是说,只复制实际更改的位.
如果您发现您希望这些流程能够相互通信,那么您将开始进入更复杂的IPC领域,其中已经编写了大量的书籍.