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 :

Probleme de threads


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut Probleme de threads
    Je travaille sur un script d'exploration réseaux (intranet), pour aller plus vite, je voudrais utiliser les threads mais perl me sort l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    thread failed to start: DBD::ODBC::db prepare failed: handle 2 is owned by thread 224014 not current thread 1a70ac4 (handles can't be shared between threads and your driver may need a CLONE method added) at C:\DOCUME~1\Teddy\Bureau\thread.pl line 22.
    A thread exited while 3 threads were running.
    mon code etant assez long j'en est fait un ayant la meme "structure" et souffrant de ce fait du meme probleme le voila :

    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
    #!C:/Perl/bin/perl.exe -w
    use threads;
    use DBI;
     
    my $DSN = 'driver={SQL Server};Server=Vista\mssql; database=link; uid=sa;pwd=sigeme;';
    my $dbh = DBI->connect("dbi:ODBC:$DSN", { odbc_cursortype => DBI::SQL_CURSOR_DYNAMIC, AutoCommit => 0 } ) or die ( db($DBI::errstr) );
     
     
     my $i = 2;
     
       if ($ARGV[0] =~ /^http:\/\//g ) {
         while ($i) {
         --$i;
             my $thr = threads->new(\&unix, @ARGV);
                $thr->detach;
         }
      }
     
    sub unix {
     foreach my $url (@_) {
     
      my $l = $dbh->prepare("SELECT * FROM url");
        $l->execute;
       print "$url";
     }
    }
    Merci de votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Hello,

    J'ai rencontré le même genre de problème mais sans utiliser les threads.

    Ajoute cette ligne juste apres ta connection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbh-> {odbc_SQL_ROWSET_SIZE} = 2;
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    ...
    use DBI;
     
    my $DSN = 'driver={SQL Server};Server=Vista\mssql; database=link; uid=sa;pwd=sigeme;';
    my $dbh = DBI->connect("dbi:ODBC:$DSN", { odbc_cursortype => DBI::SQL_CURSOR_DYNAMIC, AutoCommit => 0 } ) or die ( db($DBI::errstr) );
     
    $dbh-> {odbc_SQL_ROWSET_SIZE} = 2;
     
     my $i = 2; 
    ...
    ...
    Ca devrait peut être te débloquer.
    Tiens moi au courant....

    Bon courage,

    Manuxme.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta méthode mais malheuresement elle ne fonctionne pas

  4. #4
    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
    Malheureusement, ton driver DBI n'est pas thread-safe, ou plutôt il est "safe" parce qu'il n'accepte même pas qu'un même handler de DB soit partagé par plusieurs threads. Donc tu ne peux pas l'employer dans plusieurs threads à la fois. Tu as donc deux solutions : soit tu crée un handler par thread, ce qui risque d'être un peu lourd, soit tu renonces à utiliser les threads, et tu passes à un modèle linéaire, a priori pas plus lent dans le code que tu présentes. D'ailleurs pourquoi veux tu utiliser les threads dans ton cas ?

    (Je rappelle que tu peux utiliser un module comme POE pour faire de la programmation dirigée par évènements si c'est ce que tu cherches, et sans problème de threads)

    --
    Jedaï

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Le script que j'ai posté est un exemple qui présente le meme probleme que mon script , je me sert de cette exemple pour trouver la soluce pour mon script !

    Malheureusement, ton driver DBI n'est pas thread-safe, ou plutôt il est "safe" parce qu'il n'accepte même pas qu'un même handler de DB soit partagé par plusieurs threads. Donc tu ne peux pas l'employer dans plusieurs threads à la fois. Tu as donc deux solutions : soit tu crée un handler par thread, ce qui risque d'être un peu lourd, soit tu renonces à utiliser les threads, et tu passes à un modèle linéaire, a priori pas plus lent dans le code que tu présentes. D'ailleurs pourquoi veux tu utiliser les threads dans ton cas ?

    (Je rappelle que tu peux utiliser un module comme POE pour faire de la programmation dirigée par évènements si c'est ce que tu cherches, et sans problème de threads)
    Crée un handler par thread , j'ai beau me creuser la tete je ne voie pas comment faire .

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Bon j'ai utiliser les sémaphores basiquement mais au moins sa plante plus en me laissant 10 lignes d'érreur

    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
    #!C:/Perl/bin/perl.exe -w
    use threads qw(yield);
    use Thread::Semaphore;
    use DBI;
     
    my $semaphore = new Thread::Semaphore;
    my $thr;
     
    my $DSN : shared = 'driver={SQL Server};Server=Vista\mssql; database=link; uid=sa;pwd=sigeme;';
    my $dbh : shared = DBI->connect("dbi:ODBC:$DSN", { odbc_cursortype => DBI::SQL_CURSOR_DYNAMIC, AutoCommit => 0 } ) or die ( db($DBI::errstr) );
     
     my $i = 2;
     
       if ($ARGV[0] =~ /^http:\/\//g ) {
         while ($i) {
         --$i;
         foreach ($i) {
                $thr = threads->new(\&unix, @ARGV);
                $thr->detach;
            }
         }
     
      }
     
    sub unix {
     foreach my $url (@_) {
     $semaphore->down;
      my $l = $dbh->prepare("SELECT * FROM url");
        $l->execute;
       print "$url";
     $semaphore->up;
     }
    }
     
     
    sub db {
      print "===========DBI ERROR===========\n";
      print "@_\n";
      print "===============================\n";
    }
     
        $thr->join;

    perl me sort l'erreur :
    Invalid value for shared scalar at C:\DOCUME~1\Teddy\Bureau\threads.pl line 10.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Au lieu d'utiliser les threads j'ai choisie lwp::parallel::useragent qui fait ce que je veut mais est très lent comparé a lwp::useragant tout court.

    C'est pour cela que je voudrais savoir comment des scripts perl font pour faire plusieur opérations en simultanée sans threads . J'aimerai developper mon propre module si quelqu'un a un ti bout de code pour exemple je suis preneur.

    Heu malgré tout personne ne saurai comment faire avec les sémaphore , car j'aimerais bien comprend pourquoi sa ne marche pas

    merci.

  8. #8
    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 cryptorchild
    C'est pour cela que je voudrais savoir comment des scripts perl font pour faire plusieur opérations en simultanée sans threads . J'aimerai developper mon propre module si quelqu'un a un ti bout de code pour exemple je suis preneur.

    Heu malgré tout personne ne saurai comment faire avec les sémaphore , car j'aimerais bien comprend pourquoi sa ne marche pas

    merci.
    A part si tu as un multiprocesseur, tu ne feras jamais plusieurs opérations en simultanées, les threads ne sont alors qu'une commodité d'écriture. Pour quelque chose d'équivalent, mais sans threads, il suffit d'utiliser un système comme POE comme je te l'ai déjà dit.

    Quant à faire fonctionner ta solution avec des sémaphores, c'est impossible, en tout cas pas sans recréer un handler dans chaque thread étant donné qu'un objet Perl ne peut pas être partagé par plusieurs threads (sans parler du fait que le module n'est pas thread-safe, mais normalement avec les bons sémaphore ça devrait aller).

    --
    Jedaï

Discussions similaires

  1. Probleme de Thread ??
    Par glycerine dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 29/04/2006, 19h04
  2. Probleme de threads et de pipes
    Par Marc san dans le forum C
    Réponses: 7
    Dernier message: 22/02/2006, 21h32
  3. Problème de threads avec pthread_create
    Par 180degrés dans le forum Linux
    Réponses: 6
    Dernier message: 19/12/2005, 12h07
  4. Probleme fermeture Thread
    Par Raton dans le forum MFC
    Réponses: 4
    Dernier message: 29/09/2005, 09h51
  5. [Kylix] Problème de thread
    Par moltov dans le forum EDI
    Réponses: 1
    Dernier message: 22/06/2005, 13h28

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