2

我对 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 都在等待它的所有孩子完成他们的工作。

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

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

4

2 回答 2

2

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

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

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

于 2013-05-21T13:15:19.347 回答
1

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

于 2013-12-29T00:31:37.750 回答