[Python] Async



  • Hallo zusammen.

    Ich tu mir immer noch ziemlich schwer, async zu kapieren.

    Ich habe folgendes Szenario:
    Ich habe eine Session (steckt ein RPC-Aufruf dahinter), in welcher ich Daten von einem Server abfrage.
    Um meine Performance hoffentlich zu steigern, möchte ich statt einem großen Aufruf mehrere kleine Aufrufe asynchron starten und die Ergebnisse verarbeiten.

    Nun bin ich gerade dabei, damit herumzuspielen und gewinne den Eindruck, dass meine Funktion nicht parallel gestartet wird, sondern irgendwo blockiert:

    session = Session()
    
    async def get_data(start, end):
        with session.login():
            result = session.query(start,end)
        return result
    
    async def wait_for(task):
        while not task.done():
            print("waiting on task")
            await asyncio.sleep(1)
    
    async def main():
        task1 = asyncio.create_task(get_data(start, end))
        task2 = asyncio.create_task(wait_for(task1))
    
    
        r1 = await task1
        await task2
    
        # do something with r1
    
    asyncio.run(main())
    

    In meinen Testszenarien mit anderen Funktionen hat wait_for jede Sekunde eine Ausgabe auf die Konsole geschrieben, in diesem Beispiel erhalte ich keine Ausgabe.
    Wird das ganze überhaupt in einer Coroutine gestartet? Sind irgendwelche Anforderungen, z. B. an die Session, nicht erfüllt, oder was könnte hier schief laufen?



  • Anscheinend ist die verwendete Bibliothek nicht für async gemacht. Ich könnte mit .to_thread arbeiten - aber macht das Sinn? Wenn ich ohnehin Threads verwenden muss, könnte ich doch gleich auf entsprechende Bibliotheken zurückgreifen?
    Auf dem Gebiet des Threadings fühle ich mich außerdem sicherer als bei kooperativem Multitasking.


Anmelden zum Antworten