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
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
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.......
J'ai le message d'erreur suivant lorsque j'essaie de lancer le programme :
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 ....
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.ValueError: ctypes objects containing pointers cannot be pickled
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 :
Ami calmant, J.PWhen 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
Partager