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