我并没有参与接近操作系统的编程技术,但据我所知,当在Perl中并行执行某些操作时,选择的武器fork可能是一些基于它的有用模块.文档页面fork说:
Does a fork(2) system call to create a new process running the same program at the same point.
Run Code Online (Sandbox Code Playgroud)
因此,拥有一个耗费大量内存并且需要fork执行小任务的大型应用程序意味着将有2个大型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
Run Code Online (Sandbox Code Playgroud)
并且子进程也消耗80+ MB.
要明确:与这个分离的代码进行交流或以某种方式使用其结果并不重要,只是为了可以说" 嘿,在后台为我运行这个简单的任务,让我继续我的繁重工作......"不要浪费我的资源! "在运行繁重的perl应用程序时.
fork()toexec()是你的兔子。您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');
}
Run Code Online (Sandbox Code Playgroud)
(@ary只是用来稍微填充原始进程的内存。)
我说过fork()ing 相对便宜,尽管它确实复制了整个原始过程。这些说法并不冲突;设计者也fork注意到了同样的问题。复制是惰性的,即仅复制实际发生更改的位。
如果您发现希望进程之间能够相互通信,那么您将开始进入更复杂的 IPC 领域,有关该领域的书籍已经有很多。