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

前端之家收集整理的这篇文章主要介绍了Perl技术分离一部分代码以独立运行是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我没有参与接近操作系统的编程技术,但据我所知,当在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领域,其中已经编写了大量的书籍.

猜你在找的Perl相关文章