Thread Nach Ausgabe von CGI - foo ausführen (23 answers)
Opened by Gustl at 2020-03-25 12:37

haj
 2020-03-26 12:50
#191641 #191641
User since
2015-01-07
527 Artikel
BenutzerIn

user image
2020-03-26T09:19:58 Gustl
Webserver ist ein IIS Version 8.5.

Oh ja, das wäre durchaus auch eine relevante Information gewesen. Da kommt Dir nicht nur der Webserver in die Quere, sondern auch das Betriebssystem.

Allerdings finde ich die Aussage "fork klappt auch nicht" weder sonderlich präzise noch glaube ich das so ohne weiteres. Zwar wird fork auf Windows nur (als Threads) emuliert, aber das spielt nur insofern eine Rolle, dass double fork nix nutzt, man muss bei einem persistenten Server die Threads selber einsammeln.

Den IIS werde ich mir nicht antun, aber folgendes Programm läuft auf Windows mit Strawberry Perl 5.30 und Plack (mit cpan zu installieren): Speichern als app.psgi und im gleichen Verzeichnis plackup ausführen - dann mit dem Browser auf http://localhost:5000/ gehen. Du bekommst sofort Deine Antwort, und nach 10 Sekunden ist die Datei im Hintergrund geschrieben.

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
use strict;
use warnings;
use File::Temp ();
use POSIX ":sys_wait_h";

my $app = sub {
    my $temp = File::Temp->new(UNLINK => 0);
    my $filename = $temp->filename;

    my $pid = fork();

    defined $pid  or  return [
        500,
        ["Content-type" => 'text/plain'],
        ["Could not fork: $!"]
    ];
    if ($pid) {
        # parent process: reap children which are done,
        # then print response and return
        my $kid;
        do {
            $kid = waitpid(-1, WNOHANG);
        } while $kid < -1;

        return [
            200,
            ["Content-type" => 'text/plain'],
            ["Started process with pid '$pid'\n",
             "Printing to '$filename'\n",
            ],
        ];
    }
    else {
        # child process: take 10 seconds to print, then exit
        my $count = 1;
        while ($count < 10) {
            print $temp $count++,"\n";
            sleep 1;
        }
        close $temp;
        exit 0;
    }
}


Wenn Du die Seite ein paar Dutzend Mal lädst, bekommst Du ein paar Dutzend Dateien (die Du bei Gelegenheit aufräumen solltest) und erst mal einen Sack von Threads - nach zehn Sekunden sammelt jeder neue Request alle fertigen Threads ein. Überprüfen kannst Du das mit dem Process Explorer.

View full thread Nach Ausgabe von CGI - foo ausführen