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

Modules Perl Discussion :

petit soucie avec POE ( Component::Pool::Thread )


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Par défaut petit soucie avec POE ( Component::Pool::Thread )
    J'ai dans l'idée de multithreadé une applie en utilisant POE car l'utilisation directe des threads est impossible a cause de problème de réentrance que POE justement résoud .

    J'ai donc construit un petit code de teste pour apprendre a maitriser POE, mais je me heurte a un problème que voici j'ai un thread ( Thread::Queue) qui contient une file d'attente chaque fois que POE lance un thread celui ci prend une donnée dans la file et l'affiche mais voila j'ai des problème de redondance les valeurs sont affiché plusieur fois et ce n'est pas du tout ce que je veut je veut que chaque thread traite une donnée différente.

    voici mon code :

    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
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use POE qw( Component::Pool::Thread );
    use Thread::Queue;
     
    # Création d'une nouvelle file d'attente
    my $DataQueue = Thread::Queue->new;
     
    # Un ti tableau avec a bouffer pr les threads
    my @k = qw/a b c d e f g h i j k l m /;
     
    # On entasse des données dans la file d'attente
    foreach my $i ( @k ) {
     print " $i \n";
    $DataQueue->enqueue( $i );
    }
     
     
     POE::Component::Pool::Thread->new
        ( MinFree       => 2,
          MaxFree       => 5,
          MaxThreads    => 15,
          StartThrneads => 5,
          Name          => "ThreadPool",
          EntryPoint    => \&thread_entry_point,
          CallBack      => \&result_handler,
          inline_states => {
              _start => sub {
                             my ($kernel, $heap) = @_[ KERNEL, HEAP ];
                          while ( $DataQueue->pending() > 0 ) {
                               my $arguements = $DataQueue->dequeue;
                               # We are inside the component session
                               $kernel->yield(run => $arguements);
                               $kernel->post(ThreadPool => run => $arguements);
                      }
                 },
             }
        );
     
    # Affiche les données des threads
    sub thread_entry_point {
     #   my (@arguements) = @_;
     my $arg = shift;
        print "  $arg \n";
        return 1;
     }
     
     sub result_handler {
        my ($kernel, $result) = @_[ KERNEL, ARG0 ];
        $result == 1;
        return;
     }
     
     POE::Kernel->run();
    il produit le résultat suivant :

    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    k
    l
    m

    a

    a

    b

    b

    c

    c
    etc...
    alors que je veut


    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    k
    l
    m

    a

    b

    c
    etc...

    merci de votre aide, et bon codage !!!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Par défaut
    Perl n'a une petite idée ?

  3. #3
    Expert confirmé
    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
    Par défaut
    Essaie :
    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
     
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use POE qw( Component::Pool::Thread );
    use Thread::Queue;
    use threads::shared;
     
    # Création d'une nouvelle file d'attente
    my $DataQueue = Thread::Queue->new;
     
    # Un ti tableau avec a bouffer pr les threads
    my @k = qw/a b c d e f g h i j k l m /;
     
    # On entasse des données dans la file d'attente
    foreach my $i ( @k ) {
     print " $i \n";
    $DataQueue->enqueue( $i );
    }
     
     
     POE::Component::Pool::Thread->new
        ( MinFree       => 2,
          MaxFree       => 5,
          MaxThreads    => 15,
          StartThrneads => 5,
          Name          => "ThreadPool",
          EntryPoint    => \&thread_entry_point,
          CallBack      => \&result_handler,
          inline_states => {
              _start => sub {
                             my ($kernel, $heap) = @_[ KERNEL, HEAP ];
                          while ( $DataQueue->pending() > 0 ) {
                               my $arguements :shared = $DataQueue->dequeue;
                               # We are inside the component session
                               # $kernel->yield(run => $arguements);
                               $kernel->post(ThreadPool => run => $arguements);
                      }
                 },
             }
        );
     
    # Affiche les données des threads
    sub thread_entry_point {
     #   my (@arguements) = @_;
     my $arg = shift;
        print "  $arg \n";
        return 1;
     }
     
     sub result_handler {
        my ($kernel, $result) = @_[ KERNEL, ARG0 ];
        $result == 1;
        return;
     }
     
     POE::Kernel->run();
    --
    Jedaï

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Par défaut
    Merci Jedai ta soluce fonctionne bien , mais j'ai encore un petit soucie , voila mon application est un web crawler je voudrais pouvoir lancer plusieur bot simultanément pour l'instant je fait cela ( si je lance un thread par robot sa plante donc monothreading powaaa )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub main {
     while ( $job->pending() > 0 ) {
        my $lien  = $job->dequeue;
        my $rien  = $Core->Spider( $lien );
     }
     while ( $job->pending() < 1 ) {
       # on demande a bouffer
       my $fall = job();
     }
     &main;
    }
    J'ai fait quelque essaie avec ton code mais le probème c'est que lorsqu'il n'y a plus de données dans la file d'attente je n'arrive pas a lancer un traitement pour la remplir a nouveau

    voila mon code :


    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
    71
    72
    73
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use POE qw( Component::Pool::Thread );
    use Thread::Queue;
    use threads::shared;
     
    BEGIN {
     use CGI::Carp qw(carpout);
     open(LOG, ">>./log.txt") or die ":(";
     carpout(*LOG);
    }
     
     
     
    # Création d'une nouvelle file d'attente
    my $DataQueue = Thread::Queue->new;
     
    # Un ti tableau avec a bouffer pr les threads
    my @k = qw/a b c d e f g h i j k l m /;
     
    # On entasse des données dans la file d'attente
    foreach my $i ( @k ) {
     print " $i \n";
    $DataQueue->enqueue( $i );
    }
    # shutdown 
    my $r = 1;
     POE::Component::Pool::Thread->new
        ( MinFree       => 2,
          MaxFree       => 5,
          MaxThreads    => 15,
          StartThrneads => 5,
          Name          => "ThreadPool",
          EntryPoint    => \&thread_entry_point,
          CallBack      => \&result_handler,
          inline_states => {
              _start => sub {
                             my ($kernel, $heap) = @_[ KERNEL, HEAP ];
                      while ( $DataQueue->pending() > 0 ) {
                        $r += 1;
                               my $arguements :shared = $DataQueue->dequeue;
                               # We are inside the component session
                               # $kernel->yield(run => $arguements);
                               $kernel->post(ThreadPool => run => $arguements);
                      }
                      while ( $DataQueue->pending() < 1  and $r > 1) {
                        foreach my $i ( @k )
                        {
                           $DataQueue->enqueue( $i );
                        }
                      }
                 },
             }
        );
     
     
     
    # Affiche les données des threads
    sub thread_entry_point {
     #   my (@arguements) = @_;
     my $arg = shift;
        print "  $arg \n";
        return 1;
     }
     
     sub result_handler {
        my ($kernel, $result) = @_[ KERNEL, ARG0 ];
        $result == 1;
        return;
     }
     
     POE::Kernel->run();
    Qaund je fait Ctrl + C pour quitter l'applie pour me génre les erreurs suivante


    Uncaught exception from user code:
    _default caught state: _signal at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 77.
    at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 77
    POE::Component:ool::Thread::__ANON__('undef', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', 'HASH(0x1f94670)', '_default', 'POE::Kernel=ARRAY(0x1c7d890)', 'undef', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31, ...) called at G:/Program Files/Perl/site/lib/POE/Session.pm line 622
    POE::Session::_invoke_state('POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', '_signal', 'ARRAY(0x1fb9474)', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 928
    POE::Kernel::_dispatch_event('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', '_signal', 4096, 'ARRAY(0x1fb9474)', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31, 1152913693.25086, ...) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 858
    POE::Kernel::_dispatch_event('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Kernel=ARRAY(0x1c7d890)', 'POE::Kernel=ARRAY(0x1c7d890)', '_signal', 16, 'ARRAY(0x1fb9474)', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31, 1152913693.24991, ...) called at G:/Program Files/Perl/site/lib/POE/Resource/Events.pm line 246
    POE::Kernel::_data_ev_dispatch_due('POE::Kernel=ARRAY(0x1c7d890)') called at G:/Program Files/Perl/site/lib/POE/Loop/Select.pm line 325
    POE::Kernel::loop_do_timeslice('POE::Kernel=ARRAY(0x1c7d890)') called at G:/Program Files/Perl/site/lib/POE/Loop/Select.pm line 333
    POE::Kernel::loop_run('POE::Kernel=ARRAY(0x1c7d890)') called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 1072
    POE::Kernel::run('POE::Kernel') called at C:\Documents and Settings\Siaoly\Bureau\0.pl line 52
    main::__ANON__('undef', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', 'HASH(0x1f94670)', '_start', 'POE::Kernel=ARRAY(0x1c7d890)', 'undef', 'G:/Program Files/Perl/site/lib/POE/Kernel.pm', 1290, ...) called at G:/Program Files/Perl/site/lib/POE/Session.pm line 622
    POE::Session::_invoke_state('POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', '_start', 'ARRAY(0x1c34528)', 'G:/Program Files/Perl/site/lib/POE/Kernel.pm', 1290) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 928
    POE::Kernel::_dispatch_event('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Session=ARRAY(0x1f946b8)', '_start', 4, 'ARRAY(0x1c34528)', 'G:/Program Files/Perl/site/lib/POE/Kernel.pm', 1290, 1152913687.5417, ...) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 1287
    POE::Kernel::session_alloc('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Session=ARRAY(0x1f946b8)') called at G:/Program Files/Perl/site/lib/POE/Session.pm line 171
    POE::Session::try_alloc('POE::Session=ARRAY(0x1f946b8)') called at G:/Program Files/Perl/site/lib/POE/Session.pm line 532
    POE::Session::create('POE::Session', 'inline_states', 'HASH(0x1f945b0)') called at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 213
    POE::Component:ool::Thread::new('POE::Component:ool::Thread', 'MinFree', 2, 'MaxFree', 5, 'MaxThreads', 15, 'StartThrneads', 5, ...) called at C:\Documents and Settings\Siaoly\Bureau\0.pl line 56
    A thread exited while 14 threads were running at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 77.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    pourkoi lancer plusieurs process? (ou plusieurs thread)
    POE est justement fait pour faire du multi tache dans un seul et meme process: tu peux gerer plsuieurs telechargements simultanément sans aucun probleme avec POE.
    Si tu decide de faire du multiprocess il faudra que tu gere la synchronisation entre tes different robot (par exemple savoir si un autre robot a deja vu ou a deja mis en file d'attente une url donnée) et tu devra sans doute passer par des structures sur disque pour faire ca (mysql ou berkeleyDB par exemple), alors que si tu garde tout dans un seul process tu pourra gerer ca en memoire vive

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Par défaut
    pourkoi lancer plusieurs process? (ou plusieurs thread)
    POE est justement fait pour faire du multi tache dans un seul et meme process: tu peux gerer plsuieurs telechargements simultanément sans aucun probleme avec POE.
    Si tu decide de faire du multiprocess il faudra que tu gere la synchronisation entre tes different robot (par exemple savoir si un autre robot a deja vu ou a deja mis en file d'attente une url donnée) et tu devra sans doute passer par des structures sur disque pour faire ca (mysql ou berkeleyDB par exemple), alors que si tu garde tout dans un seul process tu pourra gerer ca en memoire vive
    Je veut lancer plusieur thread parce que le web_client de POE ne gère pas les robots.txt et les cookies ni meme le pragma keep_alive et donc j'utilise LWP.

    http://poe.perl.org/?POE_Cookbook/Web_Client

    Pour ce qui est de faire en sorte que chaque thread ne traite pas deux fois la meme donnée cela est déjà fait

Discussions similaires

  1. Petit soucis avec Thread::Queue et une classe
    Par vodevil dans le forum Web
    Réponses: 16
    Dernier message: 09/06/2006, 21h41
  2. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  3. Petit souci avec clause where
    Par ybruant dans le forum SQL
    Réponses: 1
    Dernier message: 21/07/2005, 22h10
  4. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45
  5. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52

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