1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#!/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 );
while ( $max_threads && threads->list >= $max_threads ) {
2019-09-04T09:56:18 styx-ccWarum willst du überhaupt threads benutzen und nicht forken?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
sub loop_threads { # Threads durchlaufen my ( $handler_sub, $max_threads ) = @_; do { for ( ($max_threads) ? threads->list(threads::joinable) : threads->list() ) { &{$handler_sub}( $_->join ); } } while ( $max_threads && threads->list >= $max_threads && sleep 3 ); }
mikaDie Threads selbst stellen für mich eigentlich kein Problem da.
2019-09-04T16:16:24 hlubenowmikaDie Threads selbst stellen für mich eigentlich kein Problem da.
Wenn das so ist, und Dein Skript tut, was es soll, dann kannst Du doch zufrieden sein.