Thread Threads durchlaufen (11 answers)
Opened by mika at 2019-08-30 19:22

mika
 2019-08-30 19:22
#190428 #190428
User since
2010-10-02
168 Artikel
BenutzerIn

user image
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)

View full thread Threads durchlaufen