我遇到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都在等待所有孩子完成他们的工作。
那我怎么能避免这个问题呢?也许我应该摆脱父进程?
欢迎任何建议和意见。 谢谢。
答案 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进程,并使用它来分叉更多的工作进程。这可以避免从父级继承状态的几乎所有问题,这可能是您遇到的问题 - 它可能特别解释为什么它有时适合您,有时不适用,这取决于进程分叉时发生的其他事情。