Perl技术分离一部分代码以独立运行是什么?

Art*_*rtM 6 perl fork process

我并没有参与接近操作系统的编程技术,但据我所知,当在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应用程序时.

dar*_*rch 3

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 领域,有关该领域的书籍已经有很多。

  • @ArtM 如前所述,这是一个懒惰的副本。而 `system('... &')` *是* `fork()` 后面跟着 `exec()`,中间有一个 shell 只是为了笑,并且启动起来更加脆弱。实现这一目标的方法不止一种;我喜欢的更好的方式。 (2认同)