[Python-de] select.epoll() vs async framework (PostgreSQL)

Stefan Schwarzer sschwarzer at sschwarzer.net
Fr Jan 19 18:02:48 EST 2018


On 2018-01-19 11:17, Stefan Behnel wrote:
> Sven R. Kunze schrieb am 18.01.2018 um 20:02:
>> On 17.01.2018 22:49, Stefan Behnel wrote:
>> Das Ineinander-Stöpseln, was ich da erlebt habe, war dann mit so einer
>> riesigen Menge Boilerplate verbunden, dass ich diese Implementierung nicht
>> wirklich ernstnehmen konnte. Für mich war es eher nur Show-Case anstelle
>> einer Implementierung mit Mehrwert. Da wäre ich jetzt wirklich interessiert
>> an realem Beispielen.
> 
> Um beim Beispiel zu bleiben, SQLAlchemy lässt sich mit ca. 10-20 Zeilen
> leicht lesbarem Code mit Hilfe eines Thread-Pools in async-Frameworks
> integrieren. Dann rufst du statt "query.all()" eben "await
> background_query(query.all)" auf, und schon blockiert's nicht mehr und
> erlaubt gleichzeitig 'unbegrenzten' I/O-Durchsatz. Empfinde ich jetzt noch
> nicht als "riesige Menge Boilerplate", und funktioniert auch mit etlichen
> anderen thread-sicheren synchronen APIs.

Mich würde es sehr interessieren, diesen "leicht lesbaren"
Code zu sehen. :-) Ist der auch leicht lesbar für jemanden,
der mit asyncio noch relativ wenig Erfahrungen hat?

Wie schwierig ist es unter diesen Umständen, selber auf
diesen Code zu kommen?

Ein weiterer Punkt: Ist das generischer Code, der sich auch
auf andere synchrone APIs anwenden lässt oder ist es
überwiegend Code, der speziell auf SQLAlchemy zugeschnitten
ist?

>> Solange wir nur auf dem Niveau "meins ist besser" argumentieren, können wir
>> hier auch aufhören.
>> Anderenfalls würde ich gerne hören, wie sich die asyncio-Gemeinde die
>> Lösung des Zwei-Welten-Problems vorstellt. Zum Beispiel anhand von WSGI.
> 
> Du solltest die Möglichkeit in Erwägung ziehen, dass das vielleicht einfach
> gar kein "Problem" ist, das eine "Lösung" erfordert.

Das habe ich zwar auch schon überlegt, dass es so sein könnte,
aber bisher habe ich nichts konkretes gesehen, was mich davon
überzeugen würde.

> Das Neuschreiben von
> Tools für async ist eigentlich nie ein Zwang, sondern entweder eine
> Optimierung bestehender (sync-)Möglichkeiten, oder ein "cooles Projekt in
> der Freizeit", oder irgendwas anderes, was Leute eben machen *wollen*.
> 
> So ist das halt bei OpenSource, niemand hält einen davon ab, das 5254.
> Template-System zu schreiben, oder die 22. Neuimplementierung von Python,
> "weil's ja so einfach ist" und "ich das viel besser kann als alle anderen",
> oder weil ich vielleicht einfach etwas dabei lernen möchte. Genauso hält
> einen niemand davon ab, ein cooles neues async-Tool zu schreiben, obwohl es
> das alles "ja schon längst gibt". Leb einfach damit, dass andere Leute
> Dinge machen, weil sie sie machen wollen, und nicht, weil du der Meinung
> bist, dass sie sinnvoll sind. Andere Menschen haben andere Anforderungen
> und andere Vorstellungen davon, was "sinnvoll" oder "cool" ist. Es gibt
> auch genug Leute, die aus voller Überzeugung Java verwenden, weil's "cool"
> ist. Kann man so oder so dazu stehen.

Ich habe ja überhaupt kein Problem damit, wenn Leute etwas aus
Interesse entwickeln. Ich finde es nur unschön, wenn man diese
zusätzlichen (gegenüber den synchronen Libraries) entwickeln
_muss_, um sie im asyncio (im Sinne von `async`/`await`) nutzen
zu können.

Ein paar Gedanken zur Vermittlung von Asyncio in Python:

Die meisten Artikel, die ich dazu bisher gesehen habe, sind
Einführungen anhand relativ einfacher Beispiele. Um den Leser
nicht gleich zu "erschrecken", werden Aufgabe und Lösung so
gewählt, dass sie gut ins Asyncio-Paradigma bzw. den Support
dafür in Python passen.

Aber wie geht es weiter, wenn man sich nicht nur einen Überblick
verschaffen, sondern Pythons Asyncio in "richtigen" Projekten
einsetzen will? Da habe ich bisher extrem wenig Dokumentation
zu gefunden. Ich glaube, das hier geht in die richtige Richtung:
https://pymotw.com/3/asyncio/index.html .

Auf der anderen "Seite" von Einsteiger-Tutorials finden sich die
technisch ausführliche Dokumentation wie die unter
https://docs.python.org/3/library/asyncio.html . Da mag zwar alles
drin stehen, aber als Einsteiger sieht man den Wald vor lauter
Bäumen nicht. Das ist, wie eine natürliche Sprache aus einem
Wörterbuch und einer Grammatik-Referenz lernen zu wollen.

Kennt ihr weitere Webseiten und gegebenenfalls Bücher, die den
Einsatz von Python-Asyncio in nicht-trivialen Projekten erläutern?

Stefan, ich hatte auch schon überlegt, dir vorzuschlagen, dazu
einen Vortrag auf der PyCon DE zu halten. Ich fürchte aber, dass
ein Vortrag nicht das richtige Medium dafür ist bzw. in der
verfügbaren Zeit kaum über eine Asyncio-Einführung hinauskommt.
Was meinst du?

Viele Grüße
Stefan


Mehr Informationen über die Mailingliste python-de