通过perl,linux和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正在等待所有的孩子完成他们的工作。

那么我怎样才能避免这个问题? 也许我应该摆脱父母的过程?

任何build议和意见,欢迎。 谢谢。

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

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

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

虽然不是直接回答你的问题,但是在一个分叉的孩子中做任何不寻常的处理都是很容易出错和不可移植的。 避免任何和所有这些问题的通用方法是使用AnyEvent :: Fork(和/或AnyEvent :: Fork :: RPC,AnyEvent :: Fork :: Pool)来创建工作进程。 这些模块从头开始创建一个新的Perl进程,并使用它来分离进一步的工作进程。 这可以避免几乎所有从父项继承状态的问题,这可能是您遇到的问题 – 尤其可以解释为什么它有时适用于您,有时甚至不适用,具体取决于流程分叉时发生的其他事情。