Bonjour,
Bien sur ma question n'est pas spécifique au Perl, mais c'est avec lui que je vais l'utiliser.
Voilà, je suis entrain d'écrire un parser de page html à partir desquelles je récupère certaines informations, jusque là, pas de problèmes.
Pour augmenter l'efficacité et la rapidité de mon programme je me suis un peu pencher vers le multi processus.
Et j'ai découvert fork(). J'ai pas réussi à trouver de documentation vraiment conséquente, mais j'ai quand même réussi à créer mes différents processus et gagner environ 70% de temps d'exécution (ce qui n'est absolument pas négligeable)
Mes questions sont donc les suivantes :
- quelles techniques judicieuses me conseillez vous pour créer un maximum de 10 processus, attendre qu'un meurt pour en lancer un nouveau, et ainsi de suite jusqu'à ce que mon programme ait terminé son travail.
- comment faire pour communiquer entre mes processus ? en effet, j'aimerai pouvoir ajouter le résultat de mon parsing dans un tableau ou un hash à la fin de celui ci, une sorte de variable globale propre au processus parent, malheuresement ce n'est logiquement pas possible, j'ai un peu vu qu'il y a la fonction pipe() pour cela, mais je n'ai pas non plus trouver de documentation satisfaisante sur son utilisation dans un cas réelle. Auriez vous des exemples ?
Voici mon code si ça peut aider :
ICi donc ce que j'aimerai ça serait rajouter $link à un hash avec comme clé la base du site.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
60
61
62
63
64
65
66
67
68
69
70 #!/usr/bin/perl use 5.008; use strict; use warnings; use Getopt::Long; use Pod::Usage; use LWP::UserAgent; use HTTP::Request::Common qw(GET HEAD); use URI::Escape qw(uri_unescape); use IO::Handle; use File::Path; use POSIX (); my $IN_FILE = ""; GetOptions ('in=s' => \$IN_FILE ) or pod2usage(2); open(G_LIST, "<$IN_FILE") || die ("can't open url file $IN_FILE: $!\n"); print ("Reading input file: $IN_FILE\n"); my @hg_list; my $ua = LWP::UserAgent->new; #We pretend to be Internet Explorer--they should be so lucky. $ua->agent("Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"); #Default is 180 secs... We don't have that much time. $ua->timeout(10); while (my $line=<G_LIST>) { next if ($line =~/^#.*/ || $line =~/^\s*$/); $line =~ s/^\s*//; $line =~ s/\s.*//; if ($line !~ /^http:/i) { $line = 'http://' . $line; } my $hg = URI->new($line)->canonical->as_string; push @hg_list, $hg; } close(G_LIST); my @childs; foreach my $url (@hg_list) { my $pid = fork(); if ($pid) { # parent push(@childs, $pid); } elsif ($pid == 0) { # child my $res = $ua->get($url); my $text=$res->content; my $base=$res->base->canonical; my $processed_image = 1; print "[$$] " . $res->status_line . "\n"; print "[$$] " . $base . "\n"; while ($text =~ /<a[^>]*href=[\s\"\']*([^>\s\"\']*)[^>]*>/ig) { my $link = URI->new_abs($1,$base)->canonical; print "\t [A]\t" . $link . "\n"; } exit(0); } else { die "couldnt fork: $!\n"; } } foreach (@childs) { waitpid($_, 0); }
Merci d'avances pour les nombreux (j'espère) conseils, liens de la bonne doc, etc..
Partager