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 :

Ajouter des objets à une liste multiprocessing.Manager.list()


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Ajouter des objets à une liste multiprocessing.Manager.list()
    Bonjour,

    J'essaie de m'initier à la programmation multithreads, mais je me heurte à un problème pour partager une liste d'objets entre plusieurs threads.
    J'ai lu dans la documentation qu'on pouvait utiliser un Manager pour contenir des objets qui pourront être manipulés par plusieurs processus.
    http://docs.python.org/library/multi...ween-processes

    Quand je crée une liste avec Manager.list(), et que j'y insère des entiers, tout se passe bien (comme dans l'exemple donné dans la doc).

    Mais quand la liste contient des instances d'une classe que j'ai écrite, ça ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        from multiprocessing import Process, Manager
     
        class Complex:
           def __init__(self, realpart, imagpart):
              self.r = realpart
              self.i = imagpart
     
        m = Manager() 
        l = m.list()
     
        x = Complex(3.0, -4.5)
        l.append(x)
    J'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "<string>", line 2, in append
          File "/usr/lib/python2.6/multiprocessing/managers.py", line 740, in _callmethod
            raise convert_to_error(kind, result)
        multiprocessing.managers.RemoteError:
        ---------------------------------------------------------------------------
        Traceback (most recent call last):
          File "/usr/lib/python2.6/multiprocessing/managers.py", line 214, in serve_client
            request = recv()
        AttributeError: 'module' object has no attribute 'Complex'
        ---------------------------------------------------------------------------
    Je ne comprends pas cette erreur, et vous ?
    Est-ce que cela veut dire qu'on ne peut pas utiliser d'objets dans une liste gérée par un multiprocessing.Manager ?
    Une telle limitation m'étonnerait...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Bonjour,

    tu es sur un environnement Windows ?

    si oui:

    http://docs.python.org/library/multi...g.html#windows

    du coup:

    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
    from multiprocessing import Manager, Process
     
    class Complex(object):
     
    	def __init__(self, realpart, imagpart):
     
    		self.r = realpart
    		self.i = imagpart
     
    if __name__ == "__main__":
     
    	x = Complex(3.0,-4.5)
    	m = Manager()
    	l = m.list()
    	l.append(x)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 330
    Points : 36 849
    Points
    36 849
    Par défaut
    Salut,
    Je n'ai pas le temps de jouer avec en ce moment mais ta réponse à l'air de dire qu'on ne sait partager que des constantes read-only...

    L'erreur dirait plutôt que recv ne sait pas ce que faire d'un Complex dans le contexte d'un Manager.
    Pour autant que ce soit "possible", il faut apprendre aux Managers ce qu'est un Complex. Probablement via un "register de l'objet" et une sous classe.
    Mais je n'ai pas le temps de jouer avec cette idée aujourd'hui
    - W

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    j'ai réussi à reproduire le même problème que l'op sous Windows, en ajoutant le bloc if __name__ == "__main__", je n'ai plus l'erreur.

    c'est une limitation connue du module multiprocessing avec Windows.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Problème résolu.
    En fait, j'avais fait une petite erreur dans mon code de départ.

    Je créais un Manager avant d'avoir défini ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    m = Manager()
     
    class Complex():
        ...
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Complex():
        ...
    m = Manager()

    J'ai échangé ces bouts de code, et ça a marché.

    Merci pour vos réponses.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/01/2012, 14h48
  2. ajouter des mots à une liste
    Par johnjrambo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/06/2011, 18h14
  3. [AC-2007] Ajouter des lignes à une liste basée sur une requête
    Par Cinesra dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/12/2010, 13h19
  4. Ajouter des éléments à une liste
    Par hassen07 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/05/2010, 18h42
  5. ajouter des valeurs à une liste déroulante
    Par Simon2 dans le forum IHM
    Réponses: 3
    Dernier message: 30/07/2007, 23h59

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