use warnings; use strict; package Thing; { sub new { return bless {}, shift; } sub users { print "in ". __PACKAGE__ . " execing users()\n"; sleep 2; # simulate long API call print "done API users()\n"; } sub save { print "in ". __PACKAGE__ . " execing save()\n"; sleep 2; # simulate long API call print "done API save()\n"; } } package main; use Parallel::ForkManager; my $max_forks = 10; my $fork = new Parallel::ForkManager($max_forks); my $api = Thing->new; print "doing stuff in main...\n"; print "calling main::save()...\n"; save($api); print "continuing in main, save() API call isn't blocking\n"; print "calling main::users()...\n"; users($api); print "finished in main, waiting for forks to finish\n"; $fork->wait_all_children; sub save { my $api = shift; fork_api_call($api, 'save'); print "forked API save...\n"; } sub users { my $api = shift; fork_api_call($api, 'users'); print "forked API users...\n"; } sub fork_api_call { my ($api, $sub) = @_; for (0..$max_forks){ $fork->start and last; $api->$sub(); $fork->finish; } }