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 :

Faire un sleep non blockant avec des threads


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut Faire un sleep non blockant avec des threads
    J'ai écrit un script qui d'un coté scanne un répertoire et de l'autre envoie des données via sur le réseau.

    J'ai pensé utiliser fork() mais le problème c'est que le fils ne meurent biensur jamais donc un waitpid() bloquerais le père qui attendrais que le fil meurent pour acceder au hash pareil pour le file il attendrais que papa soit entérré .

    J'ai donc opté pour les thread mais le problème c'est que vue que je scanne le répertoire toute les 10 mn je fait un sleep(600); mais sa bloque tout le script sans comtper que les threads sa pompe pas mal de cpu mon pc est poussif heu enfin y'a 5 ans c'etait un bete de course la il vas aussi vite qu'un grille pain .

    Si vous avez un solution pour fork() je suis tout ouie sinon thread

    mici
    Images attachées Images attachées  
    Everybody have in their the potential to be their own god : Marilyn Manson

  2. #2
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    J'ai fait la progra avec fork() le programe semble bien ce comporter vue que les accès au hash semble bloquant.


    Je voudrais écrire un client tcp capable d'ouvrire plusieur centaine de connexion en parallèle afin de mettre mon programme en situation de stresse, mais je vois pas trop qu'elle lib utiliser .
    Everybody have in their the potential to be their own god : Marilyn Manson

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    pourquoi veux tu utiliser deux threads?
    Ne peux tu pas tout faire en un seul thread?
    tu veux scanner un repertoire et envoyer la liste sur plusieurs socket en meme temps?
    Pour ce genre de truc le mieux est souvent d'utiliser une boucle d'evenement genre POE ou Event ou Event::Lib : tu va pouvoir gerer un tres grand nombre de socket dans un seul thread
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  4. #4
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Sinon, si tu veux vraiment passer par des fork(), tu peux gérer la mort de tes fils avec des signaux : tu les tues avec kill, tu récupères leur retour avec waitpid() (attention aux zombies) et ensuite tu fais ton sleep

    Mais la solution de pospos est sans doute préférable, j'en donne juste une seconde (TIMTOWTDI ).
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  5. #5
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par pospos
    pourquoi veux tu utiliser deux threads?
    Ne peux tu pas tout faire en un seul thread?
    tu veux scanner un repertoire et envoyer la liste sur plusieurs socket en meme temps?
    Pour ce genre de truc le mieux est souvent d'utiliser une boucle d'evenement genre POE ou Event ou Event::Lib : tu va pouvoir gerer un tres grand nombre de socket dans un seul thread
    Humm sa doit être possible sans forker en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Boot
      Scanner répertoire
         Ajouter les nouveaux fichiers dans la table de hashage
         FIN
      Lancer le Serveur
         Distribué liste
         FIN Server quand liste fini
    -> Boot
    Ce qui est chiant c'est que le serveur meure a un moment et que les clients vont essayer de ce connecter dans le vent par moment


    Mon script tourne bien avec un fork() mais je voudrais juste une précision si le père et le fils accède tout deux au hash en meme temps cela pose t'il problème je n'en est pas constaté mais je me pose la question
    Everybody have in their the potential to be their own god : Marilyn Manson

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    apres un fork les espaces memoires sont totalement independant, donc il faut que ton hash ai été créé avant le fork, et ensuite tu peux en faire ce que tu veux, mais un modification dans un des fils ne sera pas visible pour les autres.
    Si tu veux que ce soit le cas alors utilise plutot une hash sur disque genre BerkeleyDB
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  7. #7
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    En fait pour éviter ce dont tu parle j'ai mis le hash directement dans l'object je m'explique quand j'invoque la fonction new() de ma lib bah dedans y'a le hash

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub new
    {
       my $class = shift;
       return bless  {
         'Queue' => {}
      }, $class;
    }
    Everybody have in their the potential to be their own god : Marilyn Manson

  8. #8
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    J'ai trouvé une solution sur pour mon applie j'utilise une base de donées sql j'ai créé une nouvelle base de donées mais comme DBI supporte pas non plus fork() (mais bon sa m'étonne pas de DBI), j'ai utilisé cette technique :

    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
    sub _run_loader
    {
      my $pid = fork();
      if ($pid)
      {
       Server:
         my $self = $_[0];
         $self->{'Queue'} = DBI->connect("dbi:ODBC:$self->{Queue}", { odbc_cursortype => DBI::SQL_CURSOR_DYNAMIC, AutoCommit => 0 });
         print ">> Start Server\n";
         $self->_run_server();
       goto Server;
     
      }
       else
      {
        Scan: 
         my $self = $_[0];
         $self->{'Queue'} = DBI->connect("dbi:ODBC:$self->{Queue}", { odbc_cursortype => DBI::SQL_CURSOR_DYNAMIC, AutoCommit => 0 });
         print ">> Start Scanner\n";
         $self->_run_scan();
        goto Scan;
      }
    }

    C'est barbare mais sa marche
    Everybody have in their the potential to be their own god : Marilyn Manson

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

Discussions similaires

  1. Péage avec des Threads
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 20
    Dernier message: 20/06/2007, 14h35
  2. Problème avec des threads
    Par rajuto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 11/02/2007, 20h41
  3. Faire une interface en direct3D avec des bouttons.
    Par CREZ59 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/08/2006, 21h47
  4. [Threads] Actions continues avec des threads
    Par MiJack dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 10/10/2005, 17h32

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