加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 22:06:11 所属栏目:大数据 来源:网络整理
导读:我没有参与接近操作系统的编程技术,但据我所知,当在Perl中并行执行某些操作时,选择的武器就是fork,可能还有一些基于它的有用模块. fork的doc页面说: Does a fork(2) system call to create a new process running the same program at the same point. 因此
我没有参与接近操作系统的编程技术,但据我所知,当在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领域,其中已经编写了大量的书籍.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读