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 :

[PYTHON 3.X] erreur sur passage de queue en multiprocessing


Sujet :

Python

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut [PYTHON 3.X] erreur sur passage de queue en multiprocessing
    hello,
    je cherche à faire fonctionner un serveur tornado websocket sous windows 7 python 3.4 avec en tâche parallèle la gestion d'un port série. Pour communiquer entre les deux programmes j'utilise des queues.
    voici une partie du programme principal server.py
    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
    22
    23
    24
    25
    26
    import tornado.httpserver
    import tornado.ioloop
    import tornado.web
    import tornado.websocket
    import tornado.gen
    from tornado.options import define, options
    import os
    import time
    import multiprocessing
    import serialworker
    import json
     
    define("port", default=8080, help="run on the given port", type=int)
     
    clients = []
    input_queue = multiprocessing.Queue()
    output_queue = multiprocessing.Queue()
     
    ## code non montré 
     
    if __name__ == '__main__':
        ## start the serial worker in background (as a deamon)
        sp = serialworker.SerialProcess(input_queue,output_queue)
        sp.daemon = True
        sp.start()
    #  etc.......
    du côté du fichier serialworker.py pour la gestion du port série :
    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
    import serial
    import time
    import multiprocessing
     
    ## Change this to match your local settings
    SERIAL_PORT = 'COM30'
    SERIAL_BAUDRATE = 9600
     
    class SerialProcess(multiprocessing.Process):
     
        def __init__(self, input_queue, output_queue):
            multiprocessing.Process.__init__(self)
            self.input_queue = input_queue
            self.output_queue = output_queue
            self.sp = serial.Serial(SERIAL_PORT, SERIAL_BAUDRATE, timeout=1)
     
        def close(self):
            self.sp.close()
    #etc ....
    J'ai le message d'erreur suivant lorsque j'essaie de lancer le programme :
    ValueError: ctypes objects containing pointers cannot be pickled
    le problème est certainement dû au passage des queues entre les deux process. Il n'y a pas ce problème sous linux mais je crois que le multiprocessing utilise par défaut le fork sous linux et le spawn sous windows.
    Comment puis-je m'en sortir ?

    [EDIT] J'ai vu cette réponse à mon problème dans une discussion mais comme je suis novice en python je ne sais pas comment faire :
    When you use multiprocessing every process has its own address space. The pointer would not be valid in another process.
    translate the object to a python object or to a ctypes type without pointers and it should work.
    Keep in mind that changes to the object that occur in the other process will not be reflected in the parent unless you send the object back on the queue.
    - See more at: http://www.mzan.com/article/18976937....h1FziWFR.dpuf
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par jurassic pork Voir le message
    le problème est certainement dû au passage des queues entre les deux process. Il n'y a pas ce problème sous linux mais je crois que le multiprocessing utilise par défaut le fork sous linux et le spawn sous windows.
    Comment puis-je m'en sortir ?
    Le message d'erreur dit seulement que çà veut sérialiser un objet ctypes contenant des pointeurs, comme pickle ne sait pas faire par défaut, çà plante. Mais votre code ne montre rien de cet objet là. Pas facile d'aller plus loin.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    j'ai trouvé une solution à mon problème mais je ne sais pas vraiment trop pourquoi .
    J'ai mis l'instanciation de la classe Serial dans le run plutôt que dans le init de la classe SerialProcess :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class SerialProcess(multiprocessing.Process):
     
        def __init__(self, input_queue, output_queue):
            multiprocessing.Process.__init__(self)
            self.input_queue = input_queue
            self.output_queue = output_queue
    #        self.serie = serial.Serial(SERIAL_PORT, SERIAL_BAUDRATE, timeout=1)
     
        def run(self):
            self.serie = serial.Serial(SERIAL_PORT, SERIAL_BAUDRATE, timeout=1)
            self.serie.flushInput()
    #etc ...
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

Discussions similaires

  1. [Python 2.X] Tutoriel Python : erreur sur turtle.color
    Par swampsnake dans le forum Général Python
    Réponses: 2
    Dernier message: 22/10/2014, 10h05
  2. python et unicode => erreur sur freebsd (et pas sur mac)
    Par and1hotsauce dans le forum Général Python
    Réponses: 4
    Dernier message: 16/02/2011, 10h46
  3. Erreur sur passage au 2008 R2
    Par jff42 dans le forum Administration
    Réponses: 0
    Dernier message: 09/11/2010, 11h07
  4. COM : Erreur sur SaveAs au passage à Excel 2007
    Par Antjac dans le forum Langage
    Réponses: 1
    Dernier message: 07/12/2009, 11h32
  5. Erreur sur le TNSListener après installation de 9iAS
    Par Patmane dans le forum Installation
    Réponses: 4
    Dernier message: 04/02/2004, 11h16

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