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 :

Question concernant le Multiprocessing [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    CP
    Inscrit en
    Septembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CP

    Informations forums :
    Inscription : Septembre 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Question concernant le Multiprocessing
    Bonjour,

    Il y a un truc qui m'échappe dans le multiprocessing.
    J'ai fait un bout de code et le résultat n'est pas ce lui que j'attends.
    Si quelqu'un a les explications.

    J'ai essayé avec et sans les "join" et ça ne change rien les 2 appels s'enchainent alors que je pensais qu'il serait en //.

    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
    import multiprocessing
    def aff(nom_p, nbr_it):
        i=1
        while i < nbr_it:
            print("{} - En cours ... {}".format(nom_p,i))
            i+=1
     
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target=aff('p1', 20))
        p2 = multiprocessing.Process(target=aff('p2', 20))
     
        p1.start()
        p2.start()
     
        p1.join()
        p2.join()
     
        exit()
    Merci d'avance.

  2. #2
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    Bonjour,

    placer un print après la définition de p1 et p2 et vous comprendrez que ce qui sort ce sont le résultat l'exécution des fonctions qui se font au moment de la déclaration de p1 et p2.
    En gros ce que vous êtes c'est de passer comme paramètre target le retour de la fonction aff.
    Je vous invites à regarder la docs de multiprocessing: https://docs.python.org/fr/3.9/libra...rocessing.html.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    CP
    Inscrit en
    Septembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CP

    Informations forums :
    Inscription : Septembre 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci pour la réponse et la rapidité.
    Avant de poser ma question sur le forum j'avais déjà regardé la doc sur python, et des explications sur des sites francophone et anglophone.
    Mais je ne comprends pas.

    J'ai ajouté les "print" et effectivement je viens de comprendre que dès la ligne avec le target=aff, le code est exécuté et je récupère le résultat.
    Mais du coup à quoi sert le start ?
    Et comment faire si je peux lancer 2 fois la fonction aff en // ?

    Mon exemple pour faire du multi processing semble ne pas être bon.

  4. #4
    Membre averti Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 155
    Points : 346
    Points
    346
    Par défaut
    Dans votre code ce n'est pas le start() qui exécute la fonction passé à Process.
    Car ce que vous passez à Process et la valeur de retour de la fonction aff et non la fonction aff elle même.
    Et comme votre fonction n' pas de return définit alors elle retourne None par défaut, alors votre exemple est équivalent (en gros) à:

    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
     
    # coding: utf-8
     
    import multiprocessing
    def aff(nom_p, nbr_it):
        i=1
        while i < nbr_it:
            print("{} - En cours ... {}".format(nom_p,i))
            i+=1
     
    if __name__ == '__main__':
        a = aff('p1', 20)
        b = aff('p2', 20)
        p1 = multiprocessing.Process(target=a)
        p2 = multiprocessing.Process(target=b)
     
        p1.start()
        p2.start()
     
        p1.join()
        p2.join()
    pour que votre code fonctionne comme le voudriez vous pouvez reprendre l'exemple de la docu: https://docs.python.org/fr/3.9/libra...-process-class

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    moi qui suis aussi novice en multiprocessing en python j'ai eu des difficultés à faire fonctionner ton exemple :
    en fait avec l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     p1 = multiprocessing.Process(target=aff('p1', 20))
    tu exécutes directement la fonction qui est derrière target=.
    pour préparer une fonction à être exécuter dans un processus il faut mettre le nom de la fonction puis ces arguments comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     p1 = multiprocessing.Process(target=aff,  args=['p1', 20])
    ce qui est troublant c'est qu'il n'y a pas de message d'erreur dans la première syntaxe.

    à noter que dans mon IDE qui est eric6 tout s'affiche en même temps dans la fenêtre de Debug. En exécutant le script dans une invite de commande, les affichages des deux processus s'entremêlent comme prévu. J'ai aussi rajouté une temporisation ( time.sleep(0.5)) dans la boucle d'affichage.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Futur Membre du Club
    Homme Profil pro
    CP
    Inscrit en
    Septembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CP

    Informations forums :
    Inscription : Septembre 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos retours.

    J'y vois plus clair.
    En fait mon problème c'est d'avoir fait des tests sur windows !!!
    Les "print" de Aff ne s'affichaient pas sous Windows lors des appels avec target=aff, args=[...]
    Pendant mes recherches j'ai testé différents codes provenant de différents sites, et j'ai cru que la syntaxe était lié à Python 2, et j'ai modifié l'appel, et alors les "print" fonctionnaient, mais je ne savais pas qu'en faisant ça j'avais "cassé" les process fils.

    Donc, je corrige tout ça et je ferai des tests sous linux ce soir.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    CP
    Inscrit en
    Septembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CP

    Informations forums :
    Inscription : Septembre 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    En fait j'étais curieux.
    J'ai donc changé d'éditeur et grâce à vous ça fonctionne.
    Maintenant que je comprends un peu mieux le fonctionnement, je vais pouvoir essayer de l'utiliser pour modifier un traitement existant.

    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
    def aff(nom_p, nbr_it):
        print("Process id : ", os.getpid(), os.getppid())
        i=1
        while i < nbr_it:
            print("{} - En cours ... {}".format(nom_p,i))
            i+=1
            time.sleep(0.5)
     
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target=aff, args=['p1', 5])
        p2 = multiprocessing.Process(target=aff, args=['p2', 5])
     
        p1.start()
        p2.start()
     
        p1.join()
        p2.join()
     
        exit()
    Process id : 18244 5200
    p1 - En cours ... 1
    Process id : 7068 5200
    p2 - En cours ... 1
    p1 - En cours ... 2
    p2 - En cours ... 2
    p1 - En cours ... 3
    p2 - En cours ... 3
    p1 - En cours ... 4
    p2 - En cours ... 4

    Merci

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

Discussions similaires

  1. [Débutant] Deux questions concernants les vues
    Par 13obscur dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 19/04/2005, 14h29
  2. [Servlet + Class] question concernant plusieurs connections
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 29/11/2004, 16h39
  3. Réponses: 7
    Dernier message: 10/09/2004, 14h28
  4. [Indy] Questions concernant l'envoi de mail
    Par delphicrous dans le forum Web & réseau
    Réponses: 3
    Dernier message: 24/06/2004, 15h06
  5. Question concernant l'API "WaitforSingleObject
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 29/03/2003, 07h26

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