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

Ruby Discussion :

Test ruby : Lancer plusieurs instances en même instants


Sujet :

Ruby

  1. #1
    Membre régulier Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Points : 116
    Points
    116
    Par défaut Test ruby : Lancer plusieurs instances en même instants
    Bonjour,

    Je voudrai tester mon application ruby qui sera normalement appelée via HTTP (ultérieurement). donc voila mes questions :
    1- Comment je peux lancer deux ou plusieurs instances d'une application en même temps.
    2- Y a t il un outil de Test pour ruby seul (de la façon des unit tests... mais sans Rails).

    Merci beaucoup

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 172
    Points : 219
    Points
    219
    Par défaut
    Bonjour,

    1- Comment je peux lancer deux ou plusieurs instances d'une application en même temps.
    C'est quel type d'application ? Si c'est une application en Ruby pure, tu peux tout à fait lancer la commande "ruby mon_prog.rb" autant de fois que tu veux. Si tu veux prévoir le parallélisme dans ton code tu peux, au choix, utiliser Kernel#fork si tu es sous UNIX pour générer autant de processus que tu le souhaites. Ou bien utiliser les threads.

    2- Y a t il un outil de Test pour ruby seul (de la façon des unit tests... mais sans Rails).
    Pour les tests, Rails utilise l'outil de test de Ruby. Donc rien ne t'empêche d'utiliser la librairie Test::Unit pour tester du Ruby.

    Tu fais simplement un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    require 'mon_prog'
    require 'test/unit'
    à la tête de ton programme de test.
    Et en suite tu sous classe Test::Unit::TestCase pour ton cas de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class TestMonProg < Test::Unit::TestCase
      def mon_test_n1
        assert_equal(...)
         ....
      end
    end
    Si tu veux des tests de type benchmark, tu disposes de la lib standard benchmark, trés simple à utiliser.

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    require "benchmark"
    puts Benchmark.mesure { 10000.times { ma_proc.call } }
    Pour le cas le plus simple.

    Côme

  3. #3
    Membre régulier Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par Côme Voir le message
    C'est quel type d'application ? Si c'est une application en Ruby pure, tu peux tout à fait lancer la commande "ruby mon_prog.rb" autant de fois que tu veux. Si tu veux prévoir le parallélisme dans ton code tu peux, au choix, utiliser Kernel#fork si tu es sous UNIX pour générer autant de processus que tu le souhaites. Ou bien utiliser les threads.
    Bonjour
    Merci pour les réponses
    en effet, je veux faire du parallélisme, est ce que tu peux me donner un peu plus de détails sur les threads? sinon je peux basculer vers Linux donc comment je fais? (Ce sera très gentil de me donner les deux méthodes )
    Merci

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 172
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par abir84 Voir le message
    (Ce sera très gentil de me donner les deux méthodes )
    Pour les threads, rien de plus simple. Exemple pour lancer 10 fois mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    threads = []
     
    10.times do |i|
      threads[i] = Thread.new do
        mon_programme
        Thread.current["ma_variable"] = "Je suis le thread n°#{i}"
      end
    end
    Ne pas oublier de faire ensuite un join comme dans l'exemple ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    threads.each { |thread| thread.join ; puts thread["ma_variable"]}
    ...Sinon ton programme n'attendra pas que les threads soient tous terminés avant de s'arrêter.

    Tu peux passer des arguments à Thread.new pour passer une variable externe. Tu peux même stoquer des valeurs dans un tableau de hachage dédié à chaque thread : thread["ma_variable"] dans mon exemple ci dessus. Et récupérer les valeurs ensuite à l'extérieur du thread (comme dans la boucle thread.join de mon exemple).

    Mais attention lorsque plusieurs threads accèdent la même variable ou ressource extérieure : il faut gérer les accès concurrents (avec monitor ou mutex).

    fork, je n'ai jamais utilisé car je suis sous Windows, mais a priori ce n'est pas bien compliqué non plus. Un exemple tiré du PickAxe Book :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enfant = fork do
      sleep 3
      puts "L'enfant vous dit : 'Bonjour' !"
      end
    puts "J'attends mon processus enfant..."
    Process.wait enfant
    puts "Terminé !"
    Tu peux bien sûr "forker" plusieurs fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    5.times do fork { mon_programme } end
    Je n'ai testé aucun des ex ci dessus, donc j'ai peut être des erreurs de syntaxe, mais l'idée est là.

    Côme

  5. #5
    Membre régulier Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Points : 116
    Points
    116
    Par défaut
    Merci
    J'ai testé l'exemple des thread et ça marche.
    Et effectivement, je me suis rendue avec compte equ'il y a des erreurs.

    Je ne comprends pas pourquoi les différentes instances de mon programme travaillent sur les meme variables. Je croyais que chacun avait ses variables a part?
    pour mieux m'expliquer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class calculateur
    $tableau
    def calcul
    $tableau<< "n'importe quoi"
     
    puts "nbre elements du tableau",....
    end
    Au main j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    m=Calclateur.new
    m.calcul
    m1=Calclateur.new
    m1.calcul
    ....
    Et la, lors de l'affichage le nombre des elements du tableau est erronéé (les element de tableau de m1 sont mis dans le meme tableau que m alors que je prévoyais d'avoir un tableau a part pour chaque instance!! ) Pouvez vous m'expliquer ça SVP?

  6. #6
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    tu as du te tromper quelque part, avec le bout de code suivant, chaque instance a son propre tableau et n'interfère aucunement avec les autres :

    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
    class Toto
      attr_accessor :mon_tableau
     
      def initialize
        @mon_tableau = [1, 2, 3, 4, 5]
        @mon_tableau = @mon_tableau.sort_by {rand}
      end
    end
     
    threads = []
     
    10.times do |i|
      threads[i] = Thread.new do
        Thread.current["my_array"] = Toto.new
      end
    end
     
    threads.each { |thread|
      thread.join;
      puts thread["my_array"].mon_tableau.to_s
    }
    Mais c'est dur de debugger ton code en en ayant que des bribes...

  7. #7
    Membre régulier Avatar de abir84
    Inscrit en
    Mars 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2007
    Messages : 214
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par titoumimi Voir le message
    tu as du te tromper quelque part, avec le bout de code suivant, chaque instance a son propre tableau et n'interfère aucunement avec les autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Toto
      attr_accessor :mon_tableau
     
      def initialize
        @mon_tableau = [1, 2, 3, 4, 5]
        @mon_tableau = @mon_tableau.sort_by {rand}
      end
    end
     
    ...
    }
    [...]
    Peut etre ceci est parce que j'utilise des variable ($var) au lieu d'attributs??

  8. #8
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    les variables globales, c'est tout de même un poil dangereux :

    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
    class Toto
      def initialize
      $tata = 42
      end
     
      def add
        $tata += 1
      end
     
      def view
        puts $tata
      end
    end
     
    a = Toto.new
    a.add
    a.view
    b = Toto.new
    a.view
    ça permet de les modifier depuis n'importe ou dans le programme... Donc là, ils se marchent sur les pieds...

Discussions similaires

  1. Réponses: 12
    Dernier message: 22/06/2011, 12h08
  2. [VB6] lancer plusieur Form en même temps
    Par mqsi dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2007, 15h09
  3. Lancer plusieurs .bat en même temps
    Par mdriesbach dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 22/09/2006, 17h37
  4. [Info] lancer plusieurs instances d'Eclipse
    Par soeursourire dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 08/03/2006, 17h42
  5. Réponses: 23
    Dernier message: 08/02/2006, 10h15

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