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

Sven R. Kunze srkunze at mail.de
Do Jan 18 17:11:58 EST 2018


On 18.01.2018 21:31, Achim Domma wrote:
> Würde ich nur solchen Code zu sehen bekommen, ginge es mir wohl wie dir.
> Von daher kann ich jetzt zumindest deine "Begeisterung" für asyncio
> verstehen. ;-)

:)

Mir ist in erster Linie wichtig, dass es funktioniert. Voreilige 
Optimierungen habe ich schon zur Genüge gesehen. Dafür hat es schon zu 
oft geklemmt, weil jemand meinte besonders schlau sein zu müssen. Wenn's 
brennt, dann muss es geradeaus gehen.

Und im Endeffekt ist asyncio nichts anderes als eine Optimierung. Ich 
denke, da sind wir uns einig.

> Nein, async und await sind nicht unbedingt high-level, aber eine höhere
> Abstraktion als select().

Vielleicht hinkt der Vergleich auch etwas.

EventLoop.run_forever und while True: select(...) sind miteinander 
vergleichbar.

async/await haben kein wirkliches Pendant.

>> 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.
> Meinst du mit Zwei-Welten-Problem das Problem, den Übergang von asnyc
> Code zu sync bzw. umgekehrt? Exakt das löst async/await in meinen Augen
> exakt so gut, wie es in Python auf Grund der Natur der Sprache eben
> geht. Die zwei Welten sind nunmal unterschiedlich.

Na, das würde ich nicht so unterschreiben wollen.

Deswegen auch das Beispiel mit dem WSGI. Richtig altmodisch klassisch 
hat man da einen Apache, der 20 WSGI-Worker mit Django zum Beispiel 
moderiert. Jeder Worker läuft in einem separatem Prozess. Dateien 
liefert der Apache alleine über eine entsprechende Kernel-Schnittstelle 
aus. Die Datenbank ist angebunden, 1 Worker 1 Connection üblicherweise. 
Wenn die Datenbank-Anfrage länger dauert, ist der Worker blockiert und 
kann keine anderen Anfragen beantworten. Es kann auch 10 bis 100 
DB-Anfragen für einen WSGI-Request erfolgen, oder auch mal 10.000, wenn 
der Programmierer Mist gebaut hat. :D

Jetzt die blöden Fragen:

- wie fummelt man da asyncio hinein? Ich fürchte, das würde überhaupt 
nicht gehen. "Mal eben ausprobieren" wird hart.
- *was wäre eigentlich die Zielsetzung?*
Angenommen, man hätte das doch irgendwie geschafft:
- wie stellt man sicher, dass, wenn die Abarbeitung eines Requests 
furios in, z.B., einem MemoryError scheitert, nicht auf einmal die 
anderen 100 Anfragen den Bach runtergehen?
- wie stellt man sicher, dass nicht 1 fehlerhaft implementierter View 
(das ist das Ding, was für einen Request eine Response erarbeitet), alle 
anderen 100 Anfragen blockiert - await vergessen, oder so?


Die Nachteile kooperativen Multitaskings bleiben bestehen, auch wenn 
diese totgeschwiegen werden. ;-)


Ich kann mir gut vorstellen, dass asyncio bei einem kleinen, niedlichen, 
perfekt abgeschlossenen Projekt, wie einem HTTP-File-Server (wie z.B. 
nginx) super gut funktioniert. Da ist alles gut abgestimmt, niemand 
tritt sich gegenseitig auf die Füße und es gibt eig. nur 1 Funktion -> 
serve_file.
Aber die meisten Web-Anwendungen, die Geschäftslogiken abbilden, sind 
dann doch eher ziemlich kompliziert/komplex und müssen ständig erweitert 
werden, wo ich mir gut vorstellen kann, dass man sich mit kooperativen 
Multitasking ziemlich sicher ins Knie schießt; auch je größer das Team 
wird. Da fehlen mir die Sicherungsmaßnahmen, die man bei einem separaten 
Prozess einfach hat.

> Klar kannst du eine
> Sprache wie Go (bezogen auf deine andere Nachricht) explizit für das
> Szenario designen.

Ich hoffe ja noch immer bisschen auf golang-Einfluss. :D Aber bei vielen 
hier steht da noch das Ego im Weg.

> Der Hauptkritikpunkt, den ich gelten lassen würde, ist, daß in den
> meisten Beispielen eben exakt der Übergang ausgespart wird. Ich hab' mir
> beim ersten mal auch den Wolf gesucht, bis ich die richtigen Funktionen
> zur Hand hatte. Und um sie zu benutzen, muß man schon ein solides Bild
> davon haben, was da passiert.

Ist man von Python eben nicht gewöhnt. So etwas fühlt sich dann an, wie 
wenn man von Python Ganzzahlen zu C int32 wechseln muss.

> Nochmal mein Fazit: Ich halte async/await für die beste Abstraktion, die
> in Python geht.

Ich würde diese Aussage insoweit relativieren, dass es zur Zeit als die 
von vielen beste Abstraktion angesehen wird.


Sven


Mehr Informationen über die Mailingliste python-de