#!/usr/bin/env perl # Siehe auch: https://www.perl-community.de/bat/poard/thread/20656 use diagnostics; use strict; use utf8; use warnings; use threads; sub handler_start { # Aufgabe ausführen und Ergebnis zurückgeben my ( $i, $rand ) = @_; print "Start thread $i, Sleeping $rand seconds...\n"; sleep $rand; return ( $i, $rand ); } sub handler_stop { # Ergebnis auswerten my ( $i, $rand ) = @_; print "Stop/join thread $i\n"; } sub loop_threads { # Threads durchlaufen my ( $handler_sub, $max_threads ) = @_; for ( ($max_threads) ? threads->list(threads::joinable) : threads->list() ) { &{$handler_sub}( $_->join ); } if ( $max_threads && threads->list >= $max_threads ) { # Keine "Slots" frei; D.h. warten bis Threads abgearbeitet wurden # und nochmal loop_threads durchlaufen sleep 3; # warten loop_threads(@_); } } my $max_threads = 8; # Maximale Anzahl Threads/Slots for ( my $i = 0 ; $i < 100 ; $i++ ) { my $rand = int( rand(10) ); threads->create( { "context" => "list" }, \&handler_start, ( $i, $rand ) ); loop_threads( \&handler_stop, $max_threads ); } # Als letztes alle übrigen Threads joinen; D.h. auf den letzten warten... loop_threads( \&handler_stop );