#!/usr/bin/perl use strict; use warnings; use Parallel::ForkManager; my @keycards= qw(A B C); my @users = qw(peter james john luke andrew judas); my $pm = Parallel::ForkManager->new(3); $pm->run_on_finish( sub { my $key = $_[5]->{key}; unshift(@keycards, $key); } ); foreach my $user (@users) { sleep(int(rand(3))); my $key = pop(@keycards); $pm->start and next; print "$user took the '$key' key\n"; $pm->finish(0, { key => $key }); } $pm->wait_all_children;