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

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
smtp
User
Beiträge: 3
Registriert: Sonntag 10. Januar 2016, 13:21

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
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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")
smtp
User
Beiträge: 3
Registriert: Sonntag 10. Januar 2016, 13:21

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
smtp
User
Beiträge: 3
Registriert: Sonntag 10. Januar 2016, 13:21

Besten Dank, mit

Code: Alles auswählen

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