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 :

Problème de Multiprocessing


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de airballman
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 256
    Par défaut Problème de Multiprocessing
    Bonjour,

    Le deuxième, et normalement dernier post concernant le portage de mon application sous windows!

    L'application concerne le traitement d'images; et pour aller plus vite, j'ai décomposé mon application en deux threads afin d'utiliser à fond mon dual-core.
    Sous linux donc, je lance l'application générale qui se subdivise d'elle meme en deux process, afin de traiter deux images à la fois.
    Je fais donc:

    import multiprocessing

    p1=process(...)
    p2=process(...)
    P1.start()
    p2.start()
    p1.join()
    p2.join()

    Une fois les traitemetn demandés en p1 et p2 termines, je redonne la main a mon programe qui selectionne deux autres images.

    Aucun probleme apparemment, sauf que sous windows, la ligne p.start() n'est pas effective, et mon programme 'tourne dans le vide', dans le sens ou il saute les parties de traitements et ne fait donc que les choix de fichiers.

    Sauriez vous comment régler ce problème?

    Je précise qu'en travaillant en séquentiel (sans process donc), le programme tourne intégralement (mais est bien sur deux fois plus long)...



    Merci d'avance!

    Julien

  2. #2
    Membre confirmé Avatar de airballman
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 256
    Par défaut
    Salut,


    Bon bin après des recherches approfondies je vais essayer d'apporter de leau à mon moulin.
    Je n'ai toujours pas trouvé la raison de ce problème (la doc python ecrit noir sur blanc qu'il n'est censé y avoir aucun problème de portabilité) ; mais j'ai essayer de préciser exactement les conséquences.

    J'ai tout d'abord essayé betement de remplacer mes processus par des threads. Je n'ai rien fait ed plus que changer la librairie d'import et de remplacer multiprocessing.Process par threading.Thread.

    Et la, miracle, ca marche sous les deux OS; a ceci pret que les ressources processeurs utilisées sont de 40 a peine contre un regime plein tubes pour les processus... De plus j'ai des problemes d'interecriture a linterieur des threads.... Solution rejetee donc.

    De plus, apparemment, la ligne p.start n'est pas,comme je le pensais sautée; mais effectue une action bien bizarre. Je m'explique :


    J'ai une fonction ecoute, qui appelle la fonction detect_threads. Cette fonction est censée lancer mes deux processus: deux instances d'une troisieme fonction.
    Aucun probleme sous linux.

    Sous windows, les memes lignes de code provoquent ceci:
    la ligne p.start(detect) lance une nouvelle instance de la onction ecoute.
    Le programme tourne donc en rond ; et j'ai de plus en plus de threads (ou process) lancés sur ma mahcine, ce jusqu'à utilisation complete des ressources.


    J'espere avoir precisé le probleme, et ainsi augmenter mes chances d'obtenir une aide


    Je reste a votre ecoute pour la moindre question

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Par défaut
    salut,

    tout d'abord, il faut bien comprendre la différence entre processus et thread.

    les threads (processus "légers") partage les même ressources, donc un thread peu accéder à un objet d'un autre thread.
    L'inconvénient en python est que les thread n'utilisent pas les 2 coeurs car il n'y a qu'un seul interpréteur python de lancé et commun au thread et à cause du GIL il ne s'agit que de temps partagé et pas du vrai parallélisme.

    Par contre le multiprocess utilise bien les 2 cœurs, mais le problème est que les processus fils ont un contexte mémoire indépendant (provenant d'une copie du père).
    si le père a une variable TOTO.
    Les 2 fils auront aussi une variable TOTO, mais dans une zone mémoire différente car ils ont un contexte d'exécution indépendant.

    Après je ne sais si le traitement est complètement indépendant (-> processus) ou utilise des résultats communs (besoin de communication interprocessus)

    pour tes processus, penses-tu à les "cloturer" avec la fonction
    p.terminate() sinon le fils est toujours actifs

    et si tu boucle sur ton
    p=process(...)
    p.start()

    tu vas créer un bon lot de processus actifs en mémoire

  4. #4
    Membre confirmé Avatar de airballman
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 256
    Par défaut
    ok merci de ta reponse, ca fait plaisir

    Je savais la difference entre threads et processus, mais par contre pas que seuls les process utilisaient les deux coeurs.

    C'est pourtant bien mon but alors mon idée n'est pas si débile que ca

    Concernant l'interoperaibilité,
    mon programme consiste a traiter une image sonar. je traite a laide des process partie gauche et droite en // plutot que de le faire en serie. Par de pb d utilisation de variables donc, et de plus je n'ai aucun pb sous mon linux.

    Je vais essayer avec les P.terminate() comme tu me l'a dit, sans grand espoir puisque comme je l'ai compris, le pb vient des le p.start(); et uniquement sous windows.


    Une derniere chose, je n'utilise pas de boucle pour mes threads, donc pas de pb! Le bouclage est apparement automatique sous windows, et le pg a l'air de se boucler tout seul sur la fonction en amont de la creation des process.


    Pour resumer en une ligne : sous linux tout marche. Sous windows , la commande p.start() agit comme une commande qui dirait : cree un nouveau process qui relance le prog complet; d ou lapparition de process multiples.

    J ' attends ta reponse et te remercie encore!


    Julien

Discussions similaires

  1. [Python 3.X] Problème de multiprocessing
    Par TPouliquen dans le forum Général Python
    Réponses: 0
    Dernier message: 04/04/2015, 19h04
  2. Problème avec multiprocessing.Process
    Par Spitfire 95 dans le forum Général Python
    Réponses: 3
    Dernier message: 22/09/2010, 10h18
  3. problème classe utilisant le multiprocessing
    Par airod dans le forum Général Python
    Réponses: 2
    Dernier message: 14/11/2009, 11h29
  4. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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