If P::FM doesn't work out, Thread::Queue or IPC::Msg having multiple workers waiting to service a queue might also present an elegant solution, though probably harder to implement correctly.
Comment on Re: Pre-Forking Daemon with Parallel::ForkManager