Thread Threads durchlaufen
(11 answers)
Opened by mika at 2019-08-30 19:22
Hallo,
ich habe ein Skript geschrieben das Aufgaben in Threads ausführt zur Steigerung der Performance, als wenn es das sequentiell täte. Das funktioniert auch s.u., aber was sagt ein Profi zu dieser Lösung (und kann man das so reduziert betrachten)? Die Aufgabe hier im Beispiel ist ein einfaches sleep zur Verdeutlichung. Code (perl): (dl
)
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 ); Last edited: 2019-08-31 14:25:29 +0200 (CEST) |