my ($accessToken, $appId, $userId) = (shift, shift, shift); use threads; use Thread::Queue; use WWW::Curl::Easy; use WWW::Curl::Form; my $threadLimit = 1; my $testUsers=listTestUsersFull($accessToken, $appId); my $q = Thread::Queue->new(); # A new empty queue # Worker threads my @thr = map { threads->create(sub { while (my @item = $q->dequeue(2)) { # assuming undef isn't a valid value and so can be a marker. last unless defined $item[0]; last unless defined $item[1]; deleteUser($item[1], $appId, $item[0]); } } , $appId )->detach(); } 1..$threadLimit; # Send work to the threads @testUsers = @testUsers[1..5]; foreach (keys %{$testUsers}){ $q->enqueue($userId, $$testUsers{$userId}->{access_token}); } # send markers. $q->enqueue(undef) for (1..$threadLimit); # terminate. $_->join() for @thr;