Was bringt Python Async IO in meinem Fall gegenüber select.select?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Es gibt verschiedene Möglichkeiten, anstehende Aufgaben zu verteilen und möglichst gleichzeitig zu bearbeiten. Sei es mit Multiprocessing, Threads oder eben bei der asyncio-Bibliothek mit asynchronen Routinen.

Das Konzept baut hier auf eine Event Loop, die die verschiedenen Coroutinen (mit ihren einzelnen Aufgaben) verwaltet. Die Aufgaben werden nicht parallel abgearbeitet, sondern concurrent (je Zeiteinheit / Intervall werden mehrere Aufgaben aktualisiert). Dies läuft alles auf einem Thread (dem Main Thread) ab. Die CPU wird daher nicht so stark belastet, Kontextsprünge (mit Locking und Synchronisation) zwischen verschiedenen Threads (die auch Zeit und Speicher kosten) sind nicht nötig. Bei I/O-Operationen, die häufiges Warten auf bestimmte Ergebnisse erfordern, macht sich das ereignisbasierte Design in der Performance positiv bemerkbar (ein Artikel dazu).

Ich bin mir jedoch nicht sicher, ob ich etwas Zeit investieren soll, um dies zu erlernen, (...)

Dein Anwendungsfall erscheint passend für die Nutzung von asyncio, also würdest du davon auch profitieren können.

Ich sehe bisher nur Vorteile, deshalb die Frage, ob es auch Nachteile gibt, die ich gerade nicht sehe.

Ja, es gibt auch Nachteile. Eine sehr rechenintensive Aufgabe zum Beispiel würde die anderen Routinen blockieren, da die Aufgabenlast in der CPU ja nicht mehr so wie bei Threads aufgeteilt wird. Für solche Fälle sollte man dann doch auf andere Lösungen setzen, bzw. andere Lösungen einbinden.

Des Weiteren bedeutet das asynchrone Konzept schon auch eine gewisse Umstellung im Stil, wie man programmiert. Lies hier als kleine Vorbereitung.

Ich hatte mal das gleiche Problem, allerdings mit 10000 Servern, die über TCP angesprochen wurden.

Herkömmlich sequentiell: Dauer über 2 Stunden.

Mit asynchroner IO: Weniger als eine Sekunde.

Ich denke, damit erübrigt sich die Frage, ob du das nun tun solltest, oder nicht.

MACH ES AUF JEDEN FALL! ;)

Der Performancegewinn ist unfassbar groß!

Viel Erfolg! :)

Woher ich das weiß:Berufserfahrung

>Herkömmlich sequentiell: Dauer über 2 Stunden.

;-)

Da hast du aber etwas falsch gemacht, das kann nur sein, wenn du auf jede einzelne Antwort synchron gewartet hast, bevor du die nächste gesendet hast. Natürlich macht man das nicht so.

Ich habe auch schon mal etwa 10000 Ports gleichzeitig behandelt und das dauerte in Summe nur ganz kurz.

Dafür gibt's ja eben das Unix select, nur ist das eben Steinzeit und nicht modern. Ich erwarte mir da keinen besonderen Performancegewinn sondern einfach leichter lesbaren Code.

0

Asyncronität im Programm umzusetzen halte ich nicht nur für eleganter sondern auch effizenter. Das zu lernen halte ich für Sinnvoll.

Woher ich das weiß:eigene Erfahrung

>Das zu lernen halte ich für Sinnvoll

Ich hab nur etwas Angst, mich zu verzetteln. Bei der alten Variante musste ich manchmal timeouts einbauen, um an einer Stelle nicht zu blockieren. Mit Asyncio ist diese Problematik komplett erschlagen und ich kann auch alles in einer einzigen Eventloop ababrbeiten, ohne auf mehrere Threads zu gehen. Ich sehe bisher nur Vorteile, deshalb die Frage, ob es auch Nachteile gibt, die ich gerade nicht sehe.

Wie lange muss man sich einarbeiten, um mit dem Framework gut zu arbeiten? Ich meine, die Basic Tutorials hat man in 3 Stunden durch - aber dann?

0
@michiwien22

Ich gebe zu ich kenne die Async Funktionen auch nicht so recht mache auch lieber feste Threads und weiss was ich wie invoken muss aber es erspart dir fummeliges wait oder timeout.

Backup und es kann nichts passieren.

1
@geri3d

Ich hab mich lange gesträubt, mich damit zu beschäftigen, nach dem Motto "wer braucht das schon". Aber in einem C++ Projekt unter boost.asio hab ich gesehen, wie effizient das gehen kann. Nun will ich das auch unter Python nutzen.

0

Was möchtest Du wissen?