note
chrestomanci
<p>Here is a skeleton of what you want.</p>
<c>
#!/usr/bin/perl
use Parallel::ForkManager;
my $max_threads = 5;
my $fork_mgr = new Parallel::ForkManager($max_threads);
$fork_mgr->run_on_finish
(
sub
{
my($child_pid, $exit_code, $child_id, $exit_signal, $core_dump) = @_;
# Code to store the results from each thread go here.
}
);
foreach my $item (@big_list)
{
$fork_mgr->start($url_ent) and next URL
# Code in this block will run in parallel
my $result = do_stuff($item);
# Store the final result. The value you pass to finish will be
# received by the sub you defined in run_on_finish
$fork_mgr->finish($result);
}
$fork_mgr->wait_all_children();
# Now all child threads have finished,
# your results should be available.
</c>
<p>A few extra tips:</p>
<p>If you are running this code in the perl debugger, then you might want to debug the child threads. If so, run your program in a unix/linux xterm window. The debugger will create new xterm windows for each child thread, so you can separately step through the parent and the children</p>
<p>Conversely, if you don't want to step through the children, and your screen is filling up with windows from child threads, you can use the debug option: <c>o inhibit_exit=0</c> To suppress the display of windows for child threads that finish without hitting a breakpoint.</c>
871770
871937