通过perl,linux和任何事件在分叉进程中启动并行任务的智能方法是什么?

时间:2013-05-20 15:06:30

标签: linux perl fork anyevent

我遇到AnyEvent :: Utils :: fork_call的问题。我使用fork_call,然后做一些工作,然后我应该结束我的fork_call,并开始新的并行任务。

我试过了:

fork_call {

    # very important work

    # start new parallel task
    if (my $pid = fork) {
        # other important and very long work
    }
} sub {
    # never reached this, while parallel task working
}

我认为任何事件fork_call都在等待所有孩子完成他们的工作。

那我怎么能避免这个问题呢?也许我应该摆脱父进程?

欢迎任何建议和意见。 谢谢。

2 个答案:

答案 0 :(得分:2)

我不知道这是否适合您的需求,但您可以在第一个回调中运行下一个fork_call。这样的事情似乎有效:

fork_call {
    # Important work
} sub {
    fork_call {
        # other important work
    } sub {
        warn "done!";
    }
};

因为在第一个回调中使用了第二个fork_call,这意味着它在“重要工作”完成后分叉并启动。

答案 1 :(得分:1)

虽然不能直接回答您的问题,但在分叉的孩子中进行任何重要的处理都容易出错且无法移植。避免任何和所有此类问题的一般方法是使用AnyEvent :: Fork(和/或AnyEvent :: Fork :: RPC,AnyEvent :: Fork :: Pool)来创建工作进程。这些模块从头开始创建一个新的Perl进程,并使用它来分叉更多的工作进程。这可以避免从父级继承状态的几乎所有问题,这可能是您遇到的问题 - 它可能特别解释为什么它有时适合您,有时不适用,这取决于进程分叉时发生的其他事情。