在Perl中,为什么“在BEGIN里面岔开……一个可怕的前景”?
作为对另一个SO Q& A的评论的一部分,用户注意到:
为什么这是一个“可怕的前景”? (在技术层面 – 让我们放弃设计的可读性或美观) use strict; BEGIN { # Begin block to fork off a child process. # This is done in BEGIN,because otherwise My::HeavyModule module # will be loaded BEFORE the fork and thus inherited by child process # which is something we want to avoid my $init = 1; # Some lightweight init code if (my $pid = fork()) { # Nothing to do here,proceed to the rest of the main program } else { die "cannot fork" unless defined $pid; print "Child process started!n"; exit 0; } } # End BEGIN block use My::HeavyModule; # Very heavyweight on both startup time and memory # Start parent process logic using My::HeavyModule; 需要明确的是:我不是在问是否有更好的方法来实现此代码的功能.我问为什么这种方法被称为“可怕”,而不是它是否可以被更好的东西取代. 解决方法
我写了以下你所指的评论:
虽然不是因为技术原因(没有超出dan1111 mentioned和explicit portability warning in >每段代码都有一个编译时间.我希望在这里设置包和类,也许会发生一些元编程. Perl使这个简单的区别变得复杂,因为一个块的编译时间是另一个块的运行时间(例如,通过BEGIN或使用或eval或require).但总有一个明确的参考点:0美元的阶段,该程序最初被调用(另见 如果你的程序的主要工作是启动另外两个独立的程序,它可能看起来像这样: use strict; use warnings; my $pid = fork; if (not defined $pid) { die "welp,can't fork: $!"; } if ($pid) { exec $^X,"heavy_program_you_intended_to_be.pl",@ARGV; } else { ... # background yourself,etc. exec $^X,"light_program_you_intended_to_kick_off.pl"; } 但它不会在BEGIN中分叉.我认为这是你可以用Perl做一些事情的众多例子之一,但这并不意味着你应该这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |