Seite 1 von 1

multiprocessing.managers.BaseManager.connect() zwischen python2 und python3 Prozessen liefert Exception

Verfasst: Sonntag 10. Januar 2016, 13:30
von smtp
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:

Code: Alles auswählen

...
ValueError: unsupported pickle protocol: 3
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:

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()
Danke und liebe Grüße, Thomas

Re: multiprocessing.managers.BaseManager.connect() zwischen python2 und python3 Prozessen liefert Exception

Verfasst: Mittwoch 13. Januar 2016, 11:49
von Sr4l
Ich bin kurz den Manager Code durchgegangen, habe aber nach 10min aufgehört, weil ich da immer noch nicht beim Pickle Teil angekommen war.

Ich habe allerdings etwas anderes gefunden. Du kannst den Serializer von "pickle" auf "xmlrpclib" umstellen, dann spielt die Python Version keine Rolle mehr.

Code: Alles auswählen

manager = QueueManager(..., serializer="xmlrpclib")

Re: multiprocessing.managers.BaseManager.connect() zwischen python2 und python3 Prozessen liefert Exception

Verfasst: Mittwoch 13. Januar 2016, 12:04
von smtp
Vielen Dank für Deine Antwort! :-)
Ich muss gestehen, ich habe in der Zwischenzeit meinen python3-Code wieder nach python2 migriert. Ich werde aber jedenfalls Deinen Vorschlag ausprobieren und hier das Ergebnis posten.

LG, Thomas

Re: multiprocessing.managers.BaseManager.connect() zwischen python2 und python3 Prozessen liefert Exception

Verfasst: Donnerstag 21. Januar 2016, 19:27
von smtp
Besten Dank, mit

Code: Alles auswählen

serializer="xmlrpclib"
funktioniert's. :-)