socketIO AsyncClient

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
neilyoung2512
User
Beiträge: 2
Registriert: Donnerstag 2. November 2023, 19:42

Hallo,

Ich schlage mich heute schon den ganzen Tag mit einem Problem rum, das ich wohl alleine nicht lösen kann.

Ich habe eine sehr gut funktionierende App, die sehr start Gebrauch von asyncio macht. Instantiert wird diese über folgendes Konstrukt am Ende von main:

Code: Alles auswählen

    loop = asyncio.get_event_loop()
    try:
        roomClient = RoomClient(uri=uri, room='abcde', name='Python', loop=loop)
        tasks = [roomClient.run(), asyncio.Task(handleKeyboard(roomClient))]
        loop.run_until_complete(asyncio.gather(*tasks))
    except KeyboardInterrupt:
        pass
    finally:
        loop.run_until_complete(roomClient.close(closeTasks=True))
Die Klasse RoomClient nutzte bislang eine andere Kommunikationsplattform, die ich nunmehr durch socketIO ersetzen wollte.

Ich habe mir also eine Klasse geschrieben, die socketIO anwendet und diese in der RoomClient Klasse instantiert und nutze sie auch von dort für Sendung und Empfang.

Anfangs habe ich die synchrone Variante von asyncIO verwendet. Das lief und läuft eigentlich ganz gut, bis auf ein Problem, das ich nicht lösen kann:

Wenn z.B. über die synchronen callbacks von socketIO ein event reinkommt, so möchte ich es in irgendeiner Weise in die Basisklasse pushen. Das Interface dafür war schnell erstellt. Das Problem: Ich schaffe es auf keinem Weg, diesen Call "nach Hause" in die asynchrone Welt zu transferieren. Beispiel:

Die asyncIO Instanz schmeisst ein Disconnect. Der Handler sieht so aus:

Code: Alles auswählen

        @self._sio.event
        def disconnect():
            ''' Platform disconnected '''
            logging.info("disconnected")
            self._delegate.signaling_client_left()
           
Alles gut, wenn der Addressag signaling_client_left() _KEINE_ async Funktion ist. Das Problem: Bei der Behandlung dieses Events MUSS ich zwangsweise async/await Verwenden, was natürlich mit einer puren "def" nicht geht.
Habe alles versucht, mir fliegen nur Fehler um die Ohren.

In einem zweiten Versuch habe ich den asyncIO Client auf AsyncClient umgeschrieben. Nunmehr habe ich die Möglichkeit, meine Callbacks nach "oben" direkt per "await" anzusprechen. Das funktioniert gut - nur: Das ganze Konstrukt empfängt einfach keine Nachrichten mehr...Irgendwo muss da ein "await _sio.wait()" hin, das macht den Empfang wieder möglich, blockt dann aber wieder andere Dinge...

Hat irgendjemand eine Idee, wie ich da rauskomme?

Schlage mich schon mit dem Gedanken, das Ganze mal richtig zu minimieren, um dann vielleicht was zu sehen
neilyoung2512
User
Beiträge: 2
Registriert: Donnerstag 2. November 2023, 19:42

Bitte ignorieren. Habe nach Vereinfachung meinen Fehler gefunden. War in einer async Task nicht kooperativ genug
Antworten