IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

fork(), pipe child parent et communication interprocessus


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Points : 99
    Points
    99
    Par défaut fork(), pipe child parent et communication interprocessus
    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 :
    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 "couldn’t fork: $!\n";
    	}
    }
     
    foreach (@childs) {
    	waitpid($_, 0);
    }
    ICi donc ce que j'aimerai ça serait rajouter $link à un hash avec comme clé la base du site.
    Merci d'avances pour les nombreux (j'espère) conseils, liens de la bonne doc, etc..

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,


    Je ne peux pas t'aider pour ce problème, par contre je peux te conseiller d'utiliser le CPAN si ce n'est pas déjà fait.
    Comprehensive Perl Archive Network http://www.cpan.org/

    Et j'ai découvert fork(). J'ai pas réussi à trouver de documentation vraiment conséquente
    Voila ce qu'on y trouve pour le module Fork :
    http://search.cpan.org/~aristotle/Pr...b/Proc/Fork.pm
    -- Jasmine --

  3. #3
    Membre actif Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Points : 263
    Points
    263
    Par défaut
    je rajouterais meme qu'a mon avi tu trouveras la bas (en anglais) toute la documentation qu'il te faut pour le pipe.

    remarque si tu veut juste récupéré tout les résultat à la fin de tout tes processus fils tu peut aussi faire en sorte de crée un dossier dans lequel chaque processus fils ira déposer son résultat sous forme de fichier puis ensuite avec le père venir lire ces différents fichiers
    CKL
    N°°b forever
    --
    may the be with you

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 81
    Points
    81
    Par défaut
    bonjour ,
    je crois qu'il est impossible de communiquer directement entre differents Forks , je te conseil de regarder du coté des threads , mutex et semaphor si tu souhaites communiquer entre tes differents process.
    cordialement krousty

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par krousty Voir le message
    bonjour ,
    je crois qu'il est impossible de communiquer directement entre differents Forks , je te conseil de regarder du coté des threads , mutex et semaphor si tu souhaites communiquer entre tes differents process.
    Bien sûr que si il est possible de communiquer entre forks (entre process d'ailleurs), ce qui n'est pas possible (ou plutôt difficilement) c'est de partager une valeur.

    Je serais d'avis de plutôt s'en tenir au forks et de réfléchir surtout à une architecture bien pensée (fils workers, communiquant leurs trouvailles au superviseur qui assigne les tâches aux workers).

    --
    Jedaï

Discussions similaires

  1. Fork, pipe, exec
    Par shepounet dans le forum Linux
    Réponses: 2
    Dernier message: 21/03/2009, 14h08
  2. Exercice en c sur les forks+Pipe+exec
    Par Elendhil dans le forum Linux
    Réponses: 6
    Dernier message: 07/11/2007, 19h32
  3. Communications interprocessus en gtk
    Par oranoutan dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 26/08/2007, 12h55
  4. XPATH ancestor:: child:: parent::
    Par guiyomh dans le forum Flash
    Réponses: 1
    Dernier message: 13/04/2007, 17h53
  5. problème chat avec socket/fork/pipe
    Par cedricdd dans le forum Réseau
    Réponses: 10
    Dernier message: 08/03/2007, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo