[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:
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:
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 :
Citation:
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 :
Citation:
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