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

Python Discussion :

Lancer des logiciels en parallèle


Sujet :

Python

  1. #1
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 73
    Points : 52
    Points
    52
    Par défaut Lancer des logiciels en parallèle
    Bonsoir,

    j'ai fait un script dans lequel je lance différents logiciels à la chaîne (les inputs entre les logiciels ne sont pas les mêmes). Ma question est simple, j'aimerai savoir comment les lancer en parallèle.

    Pour le moment je fait quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    os.system("Logiciel_1 input1")
     
    os.system("Logiciel2 input2")
    Le problème c'est que dans cette configuration je dois attendre la fin du 1er traitement pour commencer le second, d'où une perte de temps.

    Merci à vous

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 135
    Points
    135
    Par défaut
    Tu peux regarder du côté de threading ou multiprocessing.
    os.system est déprécié, il est préférable d'utiliser subprocess.call/checkcall.

    Usage type de threading (c'est similaire pour multiprocessing):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #On définit les threads
    t0 = threading.Thread(target=subproces.call, ['ls', '/'])
    t1 = threading.Thread(target=subproces.call, ['ls', '/tmp'])
     
    # On démarre les threads (les appels à subprocess sont concurrents)
    t0.start()
    t1.start()
     
    # # On attend la "fin" des threads
    t0.join()
    t1.join()

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Points : 129
    Points
    129
    Par défaut
    Bonjour

    Je pense que la bonne réponse se trouve dans le package subprocess (http://docs.python.org/py3k/library/subprocess.html) et la commande Popen.

    Les premières utilisations paraissent un peu barbare, cependant à l'usage on réalise qu'on peut faire beaucoup de chose de manière propre et efficace.

    Cordialement
    Emmanuel

  4. #4
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 73
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup pour vos réponses je vais étudier tout ça

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par ZZelle Voir le message
    Tu peux regarder du côté de threading ou multiprocessing.
    os.system est déprécié, il est préférable d'utiliser subprocess.call/checkcall.

    Usage type de threading (c'est similaire pour multiprocessing):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #On définit les threads
    t0 = threading.Thread(target=subproces.call, ['ls', '/'])
    t1 = threading.Thread(target=subproces.call, ['ls', '/tmp'])
     
    # On démarre les threads (les appels à subprocess sont concurrents)
    t0.start()
    t1.start()
     
    # # On attend la "fin" des threads
    t0.join()
    t1.join()
    Utiliser des threads n'a aucun intérêt ici. Il suffit juste d'utiliser la classe Popen du module subprocess :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from subprocess import Popen
     
    p0 = Popen(['sleep', '10'])
    p1 = Popen(['sleep', '10'])
     
    p0.wait()
    p1.wait()

  6. #6
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 73
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Montag Voir le message
    Utiliser des threads n'a aucun intérêt ici. Il suffit juste d'utiliser la classe Popen du module subprocess :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from subprocess import Popen
     
    p0 = Popen(['sleep', '10'])
    p1 = Popen(['sleep', '10'])
     
    p0.wait()
    p1.wait()
    Bonjour,

    je ne suis pas sur de comprendre ce morceau de code, lorsque l'on utilise wait() cela signifie que les processus "s'attendent" avant de continuer ?

    J'ai tenté d'adapter ce code à mon problème comme cela :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p0 = Popen(['./logiciel input1.txt input2.txt'])
    p1 = Popen(['./logiciel2 input1.txt input2txt'])
    je vais travailler la syntaxe ce n'est pas encore ça

  7. #7
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Avec Popen, chaque élément de la "ligne de commande" doit être un item de la liste –*donc plutôt quelque chose comme ça*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p0 = Popen(['./logiciel', '-i', 'input1.txt', '-o', 'input2.txt'])
    p1 = Popen(['./logiciel2', 'input1.txt', 'input2txt'])
    (en fait, à chaque fois qu’il y a un espace non protégé, on ajoute un élément à la liste des paramètres).


    Pour ce qui est de wait(), le premier appel p0.wait() va bloquer jusqu’à ce que p0 soit terminé. Puis p1.wait() va bloquer jusqu’à ce que p1 soit terminé –*si p1 a fini avant p0, alors p1.wait() retourne immédiatement, et le résultat est toujours le même*: après ces deux lignes, on est sûr que les deux process ont fini (d’une manière ou d’une autre).

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/06/2014, 19h55
  2. Logiciel pour lancer des script sql
    Par passicon dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 11/09/2013, 11h18
  3. La meilleure protection contre le piratage des logiciels ?
    Par iubito dans le forum Débats sur le développement - Le Best Of
    Réponses: 184
    Dernier message: 23/12/2008, 13h35
  4. lancer l'installation des logiciel à partir un serveur
    Par ulysse031 dans le forum Windows Serveur
    Réponses: 9
    Dernier message: 06/09/2008, 09h15
  5. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41

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