multiprocessing.managers.BaseManager.connect() zwischen python2 und python3 Prozessen liefert Exception
Verfasst: Sonntag 10. Januar 2016, 13:30
Hallo!
Ich möchte zwischen mehreren Clients und einem Server mit einer shared Queue Daten austauschen. Dazu eignet sich aus meiner Sicht eine gesharte Queue am besten. Das Unangenehme: Ein Client läuft muss mit python3 laufen, der andere mit python2.
Um die Clients mit dem Server zu verbinden, verwende ich multiprocessing.managers.BaseManager.connect(). Bei connect() im Client kommt es zu einer Exception:
Während ich bei pickle.dump() das Protokoll explizit angeben kann, geht das bei connect() leider nicht. Hat jemand eine Idee, wie ich versionsübergreifend eine solche Kommunikation aufbauen kann? Oder gibt es ganz andere Wege als via BaseManager.connect()?
Minimalisierter Sourcecode:
Server:
Client:
Danke und liebe Grüße, Thomas
Ich möchte zwischen mehreren Clients und einem Server mit einer shared Queue Daten austauschen. Dazu eignet sich aus meiner Sicht eine gesharte Queue am besten. Das Unangenehme: Ein Client läuft muss mit python3 laufen, der andere mit python2.
Um die Clients mit dem Server zu verbinden, verwende ich multiprocessing.managers.BaseManager.connect(). Bei connect() im Client kommt es zu einer Exception:
Code: Alles auswählen
...
ValueError: unsupported pickle protocol: 3
Minimalisierter Sourcecode:
Server:
Code: Alles auswählen
#!/usr/bin/python
from multiprocessing.managers import BaseManager
try:
import queue
except ImportError:
import Queue as queue
class QueueManager(BaseManager):
pass
q = queue.Queue()
QueueManager.register('get_queue', callable=lambda:q)
manager = QueueManager(address=('', 50001), authkey="hallo".encode('latin1'))
server = manager.get_server()
server.serve_forever()
Client:
Code: Alles auswählen
#!/usr/bin/python3
from multiprocessing.managers import BaseManager
class QueueManager(BaseManager):
pass
manager = QueueManager(address=('', 50001), authkey="hallo".encode('latin1'))
manager.connect()