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 :

Accès en simultanée


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut Accès en simultanée
    Lut , j'ai le "hachage" suivant


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                my $req = [
     
                            HTTP::Request->new( 'GET', $link),
                            HTTP::Request->new( 'GET', $link),
                            HTTP::Request->new( 'GET', $link)
     
                          ];
    Je voudrais pouvoir effectuer la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $res = $ua->request($request, $arg, 4096);
    sur tout les éléments en même temps

    j'utilise pour l'instant


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      foreach my $request (@$req)
      {
     
       my $res = $ua->request($request, $arg, 4096);
     
    ....
     
    }
    Sa marche mais l'accés n'est pas simultanée.

    Merci pour vos tuyaux
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  2. #2
    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
    Qu'est ce qui ne te plaît pas dans l'exemple fourni par la doc de LWP:arallel !!
    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
     
      require LWP::Parallel::UserAgent;
      use HTTP::Request; 
     
      # display tons of debugging messages. See 'perldoc LWP::Debug'
      #use LWP::Debug qw(+);
     
      # shortcut for demo URLs
      my $url = "http://localhost/"; 
     
      my $reqs = [  
         HTTP::Request->new('GET', $url),
         HTTP::Request->new('GET', $url."homes/marclang/"),
      ];
     
      my $pua = LWP::Parallel::UserAgent->new();
      $pua->in_order  (1);  # handle requests in order of registration
      $pua->duplicates(0);  # ignore duplicates
      $pua->timeout   (2);  # in seconds
      $pua->redirect  (1);  # follow redirects
     
      foreach my $req (@$reqs) {
        print "Registering '".$req->url."'\n";
        if ( my $res = $pua->register ($req) ) { 
            print STDERR $res->error_as_HTML; 
        }  
      }
      my $entries = $pua->wait();
     
      foreach (keys %$entries) {
        my $res = $entries->{$_}->response;
     
        print "Answer for '",$res->request->url, "' was \t", $res->code,": ",
              $res->message,"\n";
      }

  3. #3
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Bé ce qui me gène c'est

    my $reqs = [
    HTTP::Request->new('GET', $url),
    HTTP::Request->new('GET', $url."homes/marclang/"),
    ];
    dans le cas de mon robot je doit faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach ($link) {
     
     
    my $reqs = [  
         HTTP::Request->new('GET', $link)
      ]; 
     
    }
    Du coup je fait toujours qu'une seule requêtes a la fois

    Non ?
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  4. #4
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Me revoilou Jedai !

    Heu ben il y a rien que me gène en fait.

    voici mon nouveau 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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    {
      my %vus; 
      my @avoir;
     
    sub robot
    {
     foreach my $url ( @_ )
     {
       next if defined $vus{$url};
       push(@avoir, $url);
     }
      return if $#avoir == -1;
     
     while (my $page = shift @avoir) {
     
      ++$vus{$page};
     
      my $link=$page;
     
       my $verif_links = verif_link_format($link);
     
           if ( $verif_links == 1 ) {
     
      my $reqs = [  
         HTTP::Request->new('GET', $link)     
      ];
     
       foreach my $req (@$reqs) { 
     
           $req->header('Accept' => [
                         qw(
                          text/html application/xhtml+xml application/msexcel
                          application/msword application/pdf application/rtf
                          application/x-javascript application/x-httpd-php
                          text/rtf text/nux application/sxc application/sxw
                          application/sxd application/mdi application/x-httpd-asp
                          application/x-httpd-aspx application/x-httpd-mspx
                          application/x-httpd-cfm application/x-httpd-jthml
                          application/x-httpd-pm application/vnd.sun.xml.calc
                          application/vnd.sun.xml.writer application/vnd.sun.xml.draw)
     
        ]
    );
        print "Registering '".$req->url."'\n"; 
        if ( my $res = $ua->register ($req) ) { 
            print STDERR $res->error_as_HTML; 
          }  
       } 
     
       my $entries = $ua->wait(2);
     
      foreach (keys %$entries) { 
     
        my $res = $entries->{$_}->response; 
     
       # print "Answer for '",$res->request->url, "' was \t", $res->code,": ", 
       # $res->message,"\n";
     
         if ( $res->is_success ) {
     
          my ($code, $date, $size, %page, $base, $content_type);
     
         $code = $res->content;
     
         $date = date();
     
         $size = size($link);
     
         $base = $res->base;
     
         $content_type = $res->content_type;
     
              %page = (
     
     
                result => [
     
                             "$code", "$link",
                             "$date", "$size KB",
                             "$content_type"
     
                          ]
     
     
                );
     
                print "$page{'result'}->[0]\n";
                print "$page{'result'}->[1]\n";
                print "$page{'result'}->[2]\n";
                print "$page{'result'}->[3]\n";
                print "$page{'result'}->[4]\n";
     
               my $p = HTML::LinkExtor->new(\&callback);
     
                   $p->parse($code);
     
                         @web = map { $_ = url($_, $base)->abs; } @web;
     
                   @web = illegal(@web);
     
                         @web = grep_array(@web);
     
     
              robot(@web);
     
       }
        else
       {
         print "Request failed\n";
       }   
      } 
      }
       else
      {
        print "Bad link\n";
       }
      }
     }
    }
    Il marche parfaitement , mais comme tu peut le voir il reste un probleme


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      my $reqs = [  
         HTTP::Request->new('GET', $link)     
      ];
    Je ne fait toujours qu'une requête a la fois
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  5. #5
    Membre du Club Avatar de bluecurve
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    En fait il faut un algo qui te créer un table associative et non le faire en dur.

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Voici une possibilité (pas la seule, loin de là).

    Au début de ta fonction, quand tu définis %vus et @avoir, tu rajoute ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    {
    my %vus;
    my @avoir;
     
    sub next_avoir {
        my @a_retourner;
        for (0..2) {
              if  ( my $url = shift @avoir) {
                  push( @a_retourner, $url );
              }
          }
         return @a_retourner;
    }
    Maintenant, plutôt que de dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ( my $page = shift @avoir ) {
    tu peux dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ( my @pages = next_avoir() ) {
    Ce qui te donnes trois (ou plus, suffit de changer la boucle plus haut) pages à chaque itération.

    Mais il y a encore du boulot, parce qu'il faut adapater la suite du code au fait que tu reçois désormais trois url en meme temps. (Aussi: ceci n'est pas testé, j'ai peut-être oublié qqch).

  7. #7
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Sa marche mais il faut effecitvement que j'adapte mon code
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  8. #8
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Arf j'ai un problème comment faire les requtes en simultané , la ok je recoit plusieur url en même temps mais pour ce qui est de faire un HTTP::Request sur tout les éléments du tableau en même temps que sais pas comment faire

    Quelqu'un sait il comment ont accède a tout les élément d'un tableau en même temps ?

    Sa m'enleverais une épine du pied
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Quelles solutions as-tu déjà essayées ?

  10. #10
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Bé j'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $reqs = [
     
                          HTTP::Request->new('GET', @page)
                 ];
    C'est archi faux


    Si je fait


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $reqs = [
     
                      HTTP::Request->new('GET', $link),
                      HTTP::Request->new('GET', $link),
                      HTTP::Request->new('GET', $link),
                      HTTP::Request->new('GET', $link)
     
    ];
    sa sert a rien puique c'est toujours le même lien


    http://cpan.uwinnipeg.ca/htdocs/Para.../Parallel.html


    Et plein d'autre solutions mais aucune ne marche
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Relis la doc pour LWP:arallel. Ca ne marche pas comme ça.

  12. #12
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    C'est quoi qui marche pas comme sa ?

    Si tu parle des méthodes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      foreach my $req (@$reqs) {
        print "Registering '".$req->url."'\n";
        if ( my $res = $pua->register ($req) ) { 
            print STDERR $res->error_as_HTML; 
        }  
      }
      my $entries = $pua->wait();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (keys %$entries) {
        my $res = $entries->{$_}->response;    print "Answer for '",$res->request->url, "' was \t", $res->code,": ",
              $res->message,"\n";
      }
    et de


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $pua->in_order  (1);  # handle requests in order of registration
      $pua->duplicates(0);  # ignore duplicates
      $pua->timeout   (2);  # in seconds
      $pua->redirect  (1);  # follow redirects
    Je les est implimenté dans mon code
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  13. #13
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    ok, je comprends maintenant. Donc tu as une liste de url et il te faut une liste de requêtes. Quel est le problème? Voici du pseudocode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my @requetes;
    foreach my $url ( @pages ) {
        my $req = .... # fabriquer une requête
        push( @requetes, $req );
    }
    Ou y a-t-il qqch qui m'échappe ?

  14. #14
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Heu non en fait tu a tout compris.
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  15. #15
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    J'arrive pas a parallélisé mon script . Il y a quelque chose qui m'intrigue le premier spider que j'ai eu etait plus rapide que celui la et il ne faisait qu'une requete a la fois alors que la , j'utilise directement lwp et c'est plus lent , c'est vraiment incompréhensible celui la devrais être bien plus rapide non ?
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Augmenter le nombre d'accés oledb simultané
    Par yzf600r6 dans le forum Administration
    Réponses: 8
    Dernier message: 22/08/2011, 15h33
  2. acces en simultanée
    Par Teo dans le forum Débuter
    Réponses: 1
    Dernier message: 23/09/2009, 09h39
  3. Accès simultanés : bloquer la lecture d'une table
    Par rohstev dans le forum Access
    Réponses: 12
    Dernier message: 01/02/2008, 20h04
  4. [SQLServer] Acces simultanés a une BD via ADO dans un dll
    Par corwin_d_ambre dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/11/2004, 15h52
  5. Réponses: 7
    Dernier message: 08/03/2004, 15h30

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