Transcript: Python Async Teil 1 - am Beispiel von Django

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

Ja, hallo liebe Hörerinnen und Hörer, willkommen im Python-Podcast.

Dominik

Heute ist die 23. Episode, also für uns wieder eine ganz besondere Zahl.

Dominik

Was machen wir heute? Heute machen wir wieder Async und Multiswelling und sowas.

Dominik

Und zwar Django Async kommt bald raus und darüber haben wir eine eigene Folge aufgenommen.

Dominik

Und zwar in dem schönen Wintergarten von Jochen. Ich bin der Dominik.

Dominik

Und diesmal haben wir natürlich wieder einen Gast. Den kennt ihr vielleicht schon.

Dominik

Hallo Johannes.

Dominik

Hallo Dominik. Hallo Jochen.

Dominik

Und hallo Jochen.

Jochen

Hallo, genau, auch wieder dabei.

Dominik

Ja, falls euch irgendwas gefällt oder nicht gefällt,

Dominik

dann schreibt uns doch wie immer gerne eine E-Mail an

Dominik

hallo-at-pison-podcast.de

Dominik

Und wir möchten uns auch gerne noch für ein paar Abonnenten bedanken.

Dominik

Und zwar haben wir allein auf Spotify

Dominik

mittlerweile über 1111 Abonnenten.

Dominik

Herzlichen Dank dafür und wuhuu!

Dominik

Sehr cool, wir freuen uns, wir finden das toll.

Dominik

Naja.

Dominik

Reicht es noch nicht, du willst die Welt verschaffen.

Jochen

Du guckst zu viele YouTube-Channels,

Jochen

oder? Ich weiß nicht genau.

Jochen

Ist das da so üblich?

Jochen

Ich weiß nicht, ob das beim Podcast auch so üblich ist.

Jochen

Ach, was denn? Ich habe mich einfach gefreut.

Jochen

Ja, nee, ist schon toll, aber keine Ahnung.

Dominik

Ja, und wo wir gerade schon bei so anderen Sachen sind.

Dominik

Also ihr habt ja vielleicht den Thomas gehört,

Dominik

der mit uns eine schöne Folge gemacht hat.

Dominik

Und der hat jetzt seinen Podcast umbenannt.

Dominik

Also wir hatten ihn das letzte Mal zu wenig erwähnt.

Dominik

Deswegen müssen wir es auch einmal extra erwähnen.

Dominik

Der ist ein ziemlich cooler Podcast, den er da hat.

Dominik

Wie heißt der jetzt, Jochen?

Dominik

Dads and Stats.

Dominik

Und er hat Kevin Sisson dabei in einem letzten Talk

Dominik

und redet über Pi MC3.

Dominik

Ich glaube, ist sehr hörenswert, die Co-Founder von Pi MC3.

Jochen

Ja, ich hab's gestern schon gehört, fand's sehr gut.

Jochen

Also, ja.

Jochen

Ja, vielen Dank, Thomas, für die nächste tolle Episode.

Jochen

Ja, und hätte ich jetzt

Jochen

gar nicht gedacht, ich meine, dass Instagram Python macht,

Jochen

aber dass sich halt deren Gründer und Ex-CEO

Jochen

irgendwie so viel mit

Jochen

Statistik und Machine Learning-Kram so beschäftigt

Jochen

ist und Data Science. Oder, naja, gut,

Jochen

das hat er ja vorher nicht so gemacht, aber das macht er jetzt halt,

Jochen

das fand ich schon sehr interessant und

Jochen

ja, war auf jeden Fall eine interessante Geschichte.

Jochen

Ja, hört doch da mal rein, wenn ihr möchtet.

Dominik

Ja, wir machen heute wieder

Dominik

Django, vor allen Dingen halt, weil Django 3.1

Dominik

jetzt im August erscheint und

Dominik

tatsächlich jetzt mehr Async-Features

Dominik

unterstützt als in der 3.0-Version, die

Dominik

seit Dezember draußen ist. Und wir

Dominik

möchten ein bisschen mit euch darüber reden oder

Dominik

untereinander darüber reden, was das überhaupt

Dominik

heißt, was das alles so ist.

Dominik

Was ist überhaupt dieses Multisprengen? Wir hatten das

Dominik

in irgendeiner Episode schon mal so ein bisschen angerissen,

Dominik

vielleicht auch so ein bisschen kurz gesprochen, aber

Dominik

uns sind noch so ein paar andere Erkenntnisse gekommen und

Dominik

darüber wollten wir halt so sprechen. Warum

Dominik

macht man so ein Shred und warum

Dominik

macht man so ein Multiprocess? Und warum macht man

Dominik

das dann irgendwie Async? Und warum macht man das mit Async.io?

Dominik

Und was gibt es dann noch für Alternativen?

Dominik

Wann braucht man das überhaupt? Und warum?

Dominik

Und warum vielleicht auch überhaupt nicht?

Dominik

Irgendwie so.

Jochen

Ja, wollten wir vielleicht erst noch so ein bisschen News machen?

Jochen

Oh, News, ja. Du hast natürlich

Dominik

recht. Neuigkeiten aus der Szene.

Dominik

Ja, wobei

Jochen

so wahnsinnig viel gab es nicht. Ich habe mir noch ein paar

Jochen

Dinge aufgeschrieben. Ich weiß nicht,

Jochen

ob du das verwendest. Insofern kannst du vielleicht

Jochen

Pylance. Ach ja.

Jochen

Ja, sehr gut. Ja, also Pylance

Dominik

ist ein neues Plugin, was für VS Code rausgekommen ist.

Dominik

Also ein neuer Language-Server, wenn ich das

Dominik

richtig verstehe, der eine ziemlich coole Sache macht.

Dominik

Also mit der Auto-Import-Sätze in VS Code und so

Dominik

und fast alle Features, die man sonst

Dominik

so auf PyCharm eher hatte. Und also

Dominik

ich mag ihn sehr gerne. Hast du ihn auch schon aktiv im Einsatz?

Jochen

Ich habe das auch schon aktiviert

Jochen

und finde es auch ziemlich gut. Also

Jochen

ich mache jetzt gar nicht so viel mit

Jochen

Type-Annotationen, aber die Verlockung

Jochen

wird stärker. Ja. Und

Jochen

das Ding kann da irgendwie einiges rausholen,

Jochen

ja. Finde ich auch. Tja, Johannes,

Jochen

da bist du raus, wenn du uns PyCharm, ne?

Jochen

Ja, tut mir leid, ich habe die Features alle schon.

Jochen

Ich meine, ich benutze ja auch PyCharm.

Jochen

Also insofern, ich finde das auch gar nicht schlecht.

Dominik

Du wurdest dazu gezwungen, habe ich gehört, Jochen.

Dominik

Naja, mehr oder weniger.

Dominik

Ich meine, ich finde es ja auch interessant.

Jochen

Also ab und zu mal andere Dinge verwenden, ist vielleicht gar nicht so schwierig.

Dominik

Bei uns nutzen wir alle VS Code.

Dominik

Achso, wer übrigens auch VS Code natürlich nutzt,

Dominik

ist Daniel Feldtroy, falls ihn kennt,

Dominik

der Autor von Two Schools of Django,

Dominik

der ja bald das 3X-Version-Buch rausnimmt.

Dominik

Und ich war letztens bei ihm ein, zwei Mal in seinem Twitch-Stream,

Dominik

weil er irgendwie streamt, irgendwie twitcht und er

Dominik

hat mir versprochen, dass er in Düsseldorf zum Essen

Dominik

vorbeikommt. Bin natürlich ganz gespannt, ob das

Dominik

irgendwie nicht nur blöd ist.

Dominik

Ja, das kann man leicht

Jochen

versprechen, ne? Solange keine Flugzeuge fliegen und so,

Jochen

ist das immer irgendwie relativ...

Dominik

Also ich glaube, ein zweites Mal, als ich da war, hat er gedacht,

Dominik

oh, warst du nicht der aus Istanbul? Ich so, nee,

Dominik

das war aus Düsseldorf, aber...

Jochen

Ja, relativ gesehen...

Johannes

Ach, Düsseldorf, Istanbul. Kann man sich dann da

Dominik

Bücher signieren lassen? Ja, also wenn die

Dominik

Altersdiener auf jeden Fall, ja, das hat er ja auch gesagt,

Dominik

vielleicht verlieh ich dann sogar dahin und dann

Dominik

Quatsch mir ein bisschen. Nein, fand ich super.

Dominik

Wollte ich nur mal kurz erwähnt haben.

Jochen

Ja, aber es stimmt. Ich gucke in letzter

Jochen

Zeit auch gerade in

Jochen

Vorbereitung auf diese Episode, habe ich relativ

Jochen

viel YouTube-Channels und so geguckt.

Jochen

Und da verwenden doch sehr viele

Jochen

VS Code. Du hast dich

Jochen

vorbereitet? Ja, ausnahmsweise mache

Jochen

ich ja sonst eigentlich nicht. Es bestehen noch Zeichen und Wunder.

Jochen

Ja, ich fand es auch sehr unangenehm, ehrlich

Jochen

gesagt. Ich weiß nicht, ob ich das nochmal machen möchte.

Jochen

Aber gerade

Jochen

zum Beispiel, da gab es

Jochen

eine Serie

Jochen

von Lukas Langer, der hat

Jochen

auch VS Code verwendet.

Jochen

Zu Async.io und so.

Jochen

Auch sehr empfehlenswert, kommt auch noch

Jochen

in die Show-Nutzung. Ja, ansonsten

Jochen

war, glaube ich, irgendwie für 3.7

Jochen

ist die letzte

Jochen

Bugfix-Release irgendwie

Jochen

gerade erschienen. Für 3.6

Jochen

noch irgendeine Security-

Jochen

Geschichte, Python, und

Jochen

das war es dann so ziemlich irgendwie mit

Dominik

Ja, dann bald ist 3.9 durch, ne?

Jochen

Ja, bald kommt dann 3.9, genau.

Jochen

Was ist denn das Tolle an 3.9?

Jochen

Jetzt hast du jetzt mal gefragt.

Jochen

Auf dem falschen Fuß erwischt.

Johannes

Also ich meine, das Tolle an 3.8

Johannes

ist ja der Walrus-Operator und den wir

Johannes

auch alle ständig immer benutzen.

Johannes

Ich wüsste nicht, was in 3.9 neues drin ist.

Johannes

Doch, also ich habe gehört,

Jochen

dass zum Beispiel diese

Jochen

Subinterpreter-Geschichte da

Jochen

irgendwie mit drin sein soll.

Jochen

Also das war fraglich eine Zeit

Jochen

lang und dann gab es... Bitte erkläre

Dominik

uns dann, was ist ein Subinterpreter?

Dominik

Ja, das ist im Grunde auch so eine

Jochen

so eine Methode, um dann halt eventuell,

Jochen

also, ähm, ja,

Jochen

um halt den Gil so ein bisschen

Jochen

loszuwerden oder halt das so ein bisschen...

Jochen

Gil ist der Global Interpreter-Log, ja?

Jochen

Ja, da werden wir sicherlich gleich noch ganz viel drüber sprechen.

Jochen

Genau, die Konsequenzen so ein bisschen zu

Jochen

mitigieren und das

Jochen

sollte, ich weiß es nicht,

Jochen

vielleicht auch so hinterher zählen, ich habe keine Ahnung.

Dominik

Also, ich habe gehört, Python 3.9 unterstützt einen neuen

Dominik

Parser und der macht ganz viel anders und deswegen

Dominik

kann man jetzt auf einmal ganz viele andere Code-Analysen

Dominik

oder irgendwas benutzen. Ja.

Dominik

Aber...

Jochen

Ja, diese Pack-Parser-Geschichte, ja.

Jochen

Ja, weiß ich aber auch nicht so viel zu.

Johannes

Also für den normalen Programmierer erstmal keine Unterschiede.

Johannes

Ja, nicht so richtig viel.

Jochen

Also muss man sich mal mit beschäftigen.

Jochen

Vielleicht gibt es auch irgendwelche total coolen Sachen.

Jochen

Na gut.

Jochen

Ansonsten Django, genau, war auch 2.2.14 und 3.0.8 sind irgendwie vor kurzem raus.

Jochen

Ja.

Dominik

Ja, also Django ist jetzt hart an der Entwicklung zu 3.1.

Dominik

Und das ist ja das, worüber wir heute reden wollen,

Dominik

weil es halt tatsächlich diese Async-Features jetzt gibt.

Dominik

Oder hast du noch mehr News aus der Szene?

Jochen

Ja, ich habe welche aus dem Hintergrat,

Jochen

beziehungsweise aus meinem persönlichen Setup.

Jochen

Oh.

Jochen

Und zwar, genau, ich weiß nicht, ob man es hören kann,

Jochen

aber jetzt ist hier, wir haben irgendwie eine große Bohrmaschine genommen

Jochen

und dann irgendwie hier mal die Außenmauer durchlöchert

Jochen

und jetzt ist hier tatsächlich kabelbasiertes Netz.

Jochen

Oh.

Jochen

Und es könnte sein, dass es jetzt deutlich weniger knackst als vorher.

Jochen

Also du meinst, weil es weniger

Dominik

Wi-Fi gibt und jetzt mehr konstantes

Jochen

Laden. Jetzt gibt es halt richtig ordentliches

Dominik

Stimmt, ich sehe sogar da hinten das Kabel,

Dominik

das durch die Wand in den Raum geht.

Dominik

Genau. Und

Jochen

eine zweite Geschichte, die auch

Jochen

neu ist und die ich eigentlich ganz

Jochen

cool finde, weil ich nicht wusste,

Jochen

also ich habe das Ding einfach mal so auf Verdacht

Jochen

gekauft und wusste nicht, ob es geht, aber es ging tatsächlich,

Jochen

war, ich habe mir so eine

Jochen

Kaldigit Docking Station

Jochen

besorgt. Eine was?

Jochen

Kaldigit. Ja, ja, ja.

Jochen

Das Ding versorgt gleichzeitig einen Rechner mit Strom, macht irgendwie Thunderbolt und du kannst Monitore dran anschließen.

Jochen

Und was ich halt da drin habe, also ich habe sozusagen nur noch ein Kabel, das ich halt immer an den Rechner stecke.

Jochen

Weil ich hatte nämlich jetzt, da ich jetzt Netzwerkkabel habe, das Problem, okay, wie mache ich denn das Netzwerkkabel an meinem Rechner fest?

Jochen

Der hat ja nur USB-C.

Jochen

Da so irgendwie so ein Dongle dran zu hängen, der dann so rumbaumelt, ist auch irgendwie etwas unschön.

Jochen

Zusätzlich zu den ganzen anderen Adaptern und Dongle, die da sowieso schon rumbaumeln.

Jochen

Ähm, äh, und, ähm, das geht damit halt ganz gut, weil da steckt man einfach Ethernet hinten rein plus irgendwie das, was zum Monitor geht und, äh, hat halt nur ein einziges Kabel, was zum Laptop geht und alles andere, äh, geht dann über die Dockingstation und was tatsächlich funktioniert ist, man hat halt, ich hab da hinten halt dann noch Storage dran und das ist schnell, äh, und, also so eine externe SSD und das ist ordentlich schnell, der Monitor ist so ein, so ein, so ein ultrafein, äh, LG 5K und da dachte ich auch so, uh, ob das funktioniert, aber es funktioniert tatsächlich.

Jochen

Und es kommt auch noch Strom durch.

Jochen

Also ich suche auch so etwas Ähnliches.

Dominik

Ich möchte gerne meine Monitore umschalten

Dominik

mit so einem Switch.

Dominik

Und zwar einmal auf eine Workstation

Dominik

und einmal auf meinen normalen Rechner.

Dominik

So eine KVM-Switch?

Dominik

Ja, genau, eine KVM-Switch.

Dominik

Und ich habe mich dann gefragt,

Dominik

ob es da was Vernünftiges für gibt.

Dominik

Weil ich hätte gerne auch die Auflösung der Monitore

Dominik

und mit Switch immer hin und her geschaltet

Dominik

zwischen allen Setups.

Dominik

Das finde ich cool.

Dominik

Aber ich habe noch keine Ahnung, was es da gibt.

Dominik

Falls ihr da irgendjemanden kennt

Dominik

oder einen guten Tipp habt,

Dominik

her damit, ich freue mich drüber.

Dominik

Das schaffe ich mir an und probiere das mal aus.

Dominik

Ansonsten

Dominik

habe ich nichts mehr. Johannes, hast du eine News?

Dominik

Eine Neuigkeit? Nee, ich bin immer noch im WLAN.

Dominik

Ich habe kein Kabel.

Dominik

Du bist tatsächlich im WLAN bei dir im Haus?

Johannes

Ja, das geht ja nicht anders.

Johannes

Das ist zu weit weg.

Johannes

Rohrmaschine? Ja, nicht in einem

Johannes

Miethaus.

Johannes

Und ich habe schon lange

Johannes

so ein relativ altes

Johannes

Lenovo-Dock. Das gehört auch

Johannes

gar nicht zu meinem Rechner, sondern das habe ich einfach mal irgendwo

Johannes

gekriegt für, keine Ahnung, 50 Euro oder so.

Johannes

Ein Dock ist total gut.

Johannes

Da ist einfach alles eingesteckt. Tastatur eingesteckt,

Johannes

Maus eingesteckt, Monitore eingesteckt,

Johannes

Storage ist auch dran.

Dominik

Das ist total gut. Und du sitzt diesmal auf einem

Dominik

anderen Stuhl und auf einem anderen Schreibtisch,

Dominik

vor einem anderen Schreibtisch in deinem Büro.

Dominik

Naja, nee, ich habe ja zwei

Dominik

Arbeitsplätze in meinem Büro.

Dominik

Der andere Arbeitsplatz.

Dominik

Der ist ja praktikant nicht zu Hause, na gut.

Dominik

Es gibt den

Dominik

mobilen Arbeitsplatz und den immobilen

Johannes

Arbeitsplatz und das ist jetzt der fest installierte

Johannes

mit den großen Monitoren.

Johannes

Okay, okay.

Johannes

Ja, cool.

Jochen

Dann würde ich sagen, von mir aus

Jochen

kann man jetzt tatsächlich das Thema

Dominik

Ich bin absolut begeistert,

Dominik

das ist eine Weltpremiere hier heute.

Dominik

Liebe Hörerinnen und Hörer, hört zu,

Dominik

ihr wisst genau, was euch jetzt erwartet.

Dominik

Weltpremiere Dango Async 3.1.

Dominik

Ja, also genau.

Dominik

Ich habe direkt mal eine Frage.

Dominik

Ja, was ist denn der Async?

Dominik

Muss ich irgendwas beachten,

Johannes

wenn ich jetzt von 3.0 auf 3.1 upgrade?

Johannes

Muss ich dann irgendwas machen

Johannes

oder geht es dann auch noch alles?

Jochen

Das geht alles genauso wie vorher auch.

Jochen

Wichtigste Frage direkt geklärt.

Dominik

Okay, also erstmal nochmal so vielleicht ganz kurz

Dominik

so zum Frame, zum Rahmen, worum es eigentlich geht.

Dominik

Was Async dann überhaupt bedeutet

Dominik

und was man jetzt damit machen kann,

Dominik

was vorher schon so ging, so diese Geschichte

Dominik

und wofür man das eigentlich braucht.

Dominik

Also womit wollt ihr denn anfangen?

Dominik

Vielleicht, was das ist, Async überhaupt?

Dominik

Und ja, dann kommt man vielleicht darauf,

Dominik

warum man das vielleicht haben wollen

Dominik

möchte oder vielleicht auch gar nicht braucht.

Dominik

Das ist gleich eine schwierige

Dominik

Frage am Anfang.

Jochen

Also ich glaube, ich würde tatsächlich mit der

Jochen

Motivation starten, weil sonst

Jochen

wird das direkt so trocken und alle Leute

Jochen

schalten sofort auf Durchzug und

Jochen

wenn man so zumindest

Jochen

weiß, dass es irgendwie vielleicht nicht so

Jochen

super unwichtig ist und dass tatsächlich

Jochen

interessante Dinge damit gehen, dann

Jochen

vielleicht hält man ein bisschen länger durch.

Dominik

Also du weißt schon, dass da Eve Online steht und das ist

Dominik

gleich sonst einen Exkurs von mir zu EVE Online.

Dominik

Ja, genau, das wäre

Dominik

interessant.

Dominik

Aber die sind doch noch auf 2.7.

Johannes

Die kriegen ja doch die ganzen Sachen gar nicht mit.

Jochen

Ja, ja, aber es gibt

Jochen

wahrscheinlich Gründe, warum das so ist.

Jochen

Also okay, ich fange einfach mal so an.

Jochen

Das ist der Grund.

Johannes

EVE Online hat von Anfang an gesagt,

Johannes

wir haben, keine Ahnung, 15 Millionen Codezeilen

Johannes

in unserem Server, wir fangen jetzt nicht an, die auf Python 3.

Johannes

Also genau, EVE Online

Dominik

basiert viel auf Python, falls ihr das noch nicht gehört habt.

Jochen

Ja, genau. Und soweit ich weiß, ich weiß nicht, ob das immer noch so ist, aber soweit ich das gehört habe, auch auf Stackless Python.

Johannes

Oh ja, das ist interessant. Da umgehen Sie ja gleich viele von den Dingen, weshalb man Async überhaupt braucht.

Jochen

Genau, also beziehungsweise zu der Zeit, wo Sie das gemacht haben, gab es das halt einfach noch nicht.

Jochen

Und Stackless Python war halt eine Lösung für die Probleme, die sich da gegeben haben.

Jochen

Und ich meine, gut, wir können auch einfach direkt so einsteigen, weil das ist ja auch eine gute Motivation, warum braucht man sowas überhaupt?

Jochen

Und was die wohl können, also hieß es jedenfalls,

Jochen

ist, dass da das alles in Stackless-Python

Jochen

halt auch so Userland-Threads oder Green-Threads

Jochen

oder wie auch immer man die nennt, sind.

Jochen

Stackless-Python, du brauchst keinen Execution-Stack

Jochen

dafür im Betriebssystem.

Jochen

Was Stackless-Python kann, ist, du kannst diese Threads picklen.

Johannes

Ja, vor allem kannst du mehr als einen ausführen, oder?

Johannes

Ja, ja, ja, das auch.

Johannes

Das hat auch keinen Global Interpreter-Log, das heißt, du kannst

Johannes

einfach...

Dominik

Jetzt gerade wieder die ganze Bagage

Dominik

mit dem Grammisch-Collector in den Müll.

Dominik

Moment! Stopp, stopp, stopp,

Dominik

da sind wir doch noch nicht.

Jochen

Also, ich wollte

Jochen

eigentlich nur mal kurz, warum man das eigentlich machen will,

Jochen

was das Coole daran ist.

Jochen

Dadurch, dass diese Threads, also wenn ich jetzt zum Beispiel

Jochen

halt ein Ding, ich habe keine Ahnung,

Jochen

wie die EVE Online funktioniert, ja, ich kenne das nicht gar nicht,

Jochen

aber ich glaube, es geht irgendwie um Raumschiffe und so,

Jochen

die da irgendwie im Weltraum rumfliegen.

Jochen

Excel in Space.

Jochen

Gut, wem es Spaß macht, aber

Jochen

naja.

Jochen

Und du hast jetzt irgendwie einen Thread, der jetzt so ein Raumschiff

Jochen

simuliert, das da so richtig gegenfliegt.

Jochen

Dann kannst du halt das Ding

Jochen

pickeln, in eine Datenbank schreiben,

Jochen

irgendwo anders wieder

Jochen

auspacken und weiter ausführen.

Jochen

Ja, das ist eine sogenannte

Jochen

Continuation, wäre mal

Johannes

die akademische Fachliteratur.

Johannes

Ah, okay, gut.

Jochen

Und das ist natürlich, wenn man ein

Jochen

Riesenuniversum hat, vielleicht eine ganz gute Sache,

Jochen

wenn man das machen kann, weil eventuell

Jochen

will man halt nicht alles immer laufen haben,

Jochen

sondern möchte halt auch

Jochen

Teile von dem Universum, das man simuliert,

Jochen

da irgendwie auch einfach mal

Jochen

einfrieren und in eine Datenbank

Jochen

schreiben und erst dann wieder auftauen, wenn man es

Jochen

tatsächlich benötigt, damit man nicht immer alles

Jochen

gleichzeitig ausführen muss oder so.

Jochen

Wäre eine gute Idee für Zeitreisen.

Dominik

Aber wir wollten über die Motivationen

Dominik

nochmal dann doch vielleicht kurz, lass das doch mal kurz

Dominik

heute ausnahmsweise strukturierter angehen.

Dominik

Und dann, wir gehen auch versprochen wieder zu

Dominik

EVE Online zurück.

Jochen

Ja, also genau, die Frage ist halt sozusagen,

Jochen

ob nicht es valide Use Cases gibt für so sehr,

Jochen

das deutsche Wort ist so ein bisschen doof,

Jochen

aber ich weiß auch nicht, ob man da ein besseres finden kann,

Jochen

nebenläufige, also massiv nebenläufige Programme.

Jochen

Also man braucht halt viel Concurrency.

Jochen

Also es gibt Probleme, da hat man halt einfach ganz viel Concurrency.

Jochen

Und die Frage wäre halt, muss man, wenn man so ein Problem hat, damit umgehen zu können, die Sprache wechseln oder nicht?

Jochen

Das ist sozusagen, also diese, ich würde sagen, das zentrale, ich habe mir ein paar Sachen angeguckt und das zentrale Ding, das hat auch Tom Christie quasi in einem Vortrag auf der DjangoCon 2019, als er irgendwie einen, den er da gehalten hat, so gesagt.

Jochen

Also es gibt da diverse Geschichten in Go,

Jochen

es gibt diverse Geschichten in Node.js oder Rust

Jochen

oder Erlang, Erlang ist auch ziemlich en vogue gerade

Jochen

und die Frage wäre halt, wenn man jetzt so einen Use Case hat,

Jochen

bedeutet das, dass man die Programmiersprache wechseln muss

Jochen

und dann halt Erlang machen muss

Jochen

oder halt kann man das auch in Python machen?

Jochen

Eigentlich kann man das auch in Python machen,

Jochen

ist jetzt sozusagen dafür die Infrastruktur

Jochen

noch nicht so ausgeprägt wie in anderen Sprachen,

Jochen

aber so prinzipiell geht das schon

Jochen

und man könnte jetzt sagen, na gut,

Jochen

das hat ein bisschen lange gedauert, also die Geschichte von

Jochen

Async in Python ist wahnsinnig lang,

Jochen

aber in letzter Zeit wird es halt

Jochen

sehr interessant. Zum Beispiel, wenn man jetzt Django als Beispiel

Jochen

nimmt, dann geht das jetzt gerade erst so

Jochen

richtig. Und der Grund dafür ist,

Jochen

dass eigentlich will man

Jochen

die Syntax dafür haben, also

Jochen

für Kuroutinen,

Jochen

und die ist erst seit 3.5 so richtig in der

Jochen

Sprache. Das heißt, vor 3.5 ist sowieso

Jochen

schwierig. Und

Jochen

Django hat mit Version

Jochen

1.11 noch Python 2 supported.

Jochen

Dann geht es auch nicht.

Jochen

Das kann man einfach vergessen.

Jochen

Und mit Django, glaube ich, 2.1, 2.2 weiß ich gar nicht mehr,

Jochen

aber noch Python 3.4.

Jochen

Und mit 3.4 geht es auch nicht.

Jochen

Das heißt, bis vor kurzem konnte Django das gar nicht

Jochen

mit der nativen Syntax machen,

Jochen

weil Python-Versionen supportet wurden,

Jochen

bei denen das einfach nicht geht.

Jochen

Und jetzt ist es halt sozusagen alt und abgehangen genug,

Jochen

dass sozusagen nur noch Python-Versionen unterstützt werden,

Jochen

mit denen man das dann tatsächlich nativ machen kann.

Jochen

Und jetzt kann man halt anfangen, das umzustellen.

Jochen

Beziehungsweise die Arbeiten daran sind ja jetzt auch schon was älter,

Jochen

aber jetzt ist es halt so weit, dass es tatsächlich mal in einer

Jochen

verwendbaren, für User verwendbaren Form halt tatsächlich in Django ankommt.

Jochen

Und wenn man sich sowas überlegt,

Jochen

also was ich zum Beispiel mir angeguckt habe,

Jochen

Erlang ist ja relativ irgendwo gerade,

Jochen

beziehungsweise halt so ein Dialekt,

Jochen

der oft dann so für Web-Entwicklungsgeschichten benutzt wird, Elixier.

Jochen

Und da gibt es auch so ein Web-Framework Phoenix zum Beispiel,

Jochen

Und da kann man auch mal sich angucken,

Jochen

so Phoenix Elixier,

Jochen

Live View, solche Sachen.

Jochen

Und das sieht alles schon sehr beeindruckend aus

Jochen

und ist auch sehr nett.

Jochen

Und die Frage wäre halt, kann man sowas in Django

Jochen

und Python auch machen? Und die Antwort ist eigentlich

Jochen

ja. Eigentlich gibt es nichts, was einen davon prinzipiell

Jochen

abhält.

Jochen

Außer, dass es halt nicht, dass noch nicht so

Jochen

unterstützt wird in den Frameworks und so. Aber

Jochen

prinzipiell geht das schon.

Dominik

Was macht das denn jetzt so schön?

Dominik

Ja.

Jochen

Ähm, keine Ahnung, habt ihr noch was oder wegen Motivation oder was? Ich überlege gerade, ob ich jetzt schon ausreichend motiviert habe.

Dominik

Ja, da fehlt noch ein kleines bisschen vielleicht. Warum man das vielleicht macht, könnte man bei der Motivation direkt sagen, oder? Also was für Problemfälle gibt es denn, die man jetzt…

Johannes

Ja, es gibt ja schon immer, also ich meine, es gibt ja schon immer Anstrengungen, Sachen zu parallelisieren und da gibt es auch schon ganz alte Sachen.

Johannes

Nur damals war es halt, damals, ja, also vor zehn Jahren war es halt noch so, dass Computer zwei Cores hatten oder vier Cores und da ist es nicht so wild, wenn du nur einen benutzt.

Johannes

Aber heutzutage ist es ja relativ leicht, gerade im Serverbereich, Sachen zu kriegen, die 64 oder 128 Cores haben oder noch mehr, wenn man das unbedingt haben möchte.

Johannes

Oder wenn man auf Grafikkarten geht, kriegt man direkt

Johannes

in die Tausenden von Cores.

Johannes

Deshalb ist das, man darf da

Johannes

nicht so viel Python verdammen, weil das

Johannes

einfach vor zehn Jahren noch kein Problem war.

Jochen

Ja, Moment, Moment, aber das ist jetzt, glaube ich,

Jochen

ein anderes Problem, oder? Also, oder aus

Jochen

meiner Perspektive ist es ein anderes.

Johannes

Generell die Nebenläufigkeit,

Johannes

die man da jetzt braucht.

Johannes

Aber das braucht man, das haben die anderen auch nicht.

Jochen

Das haben die anderen auch nicht. Also, das kriegst du auch

Jochen

auf Node.js nicht hin.

Johannes

Das mag sein, dass das mit Node.js nicht

Johannes

nicht unbedingt hinkriegst, aber mit C

Johannes

und Erlang und Rust und so weiter kriegst du die Sachen

Johannes

schon hin. Und Go auch.

Johannes

Ja, gut.

Johannes

Die nutzen schon alle Cores aus.

Jochen

Ja, aber da

Jochen

weiß ich gar nicht, ob man das unbedingt braucht.

Jochen

Da würde ich jetzt denken,

Jochen

warum? Doch, also ich glaube,

Jochen

für mich ist das schon eine Motivation,

Johannes

mehr Cores ausnutzen zu können.

Johannes

Geht zwar nicht mit

Johannes

Async, das weiß ich, aber

Johannes

ja.

Johannes

Generell, der Trend geht dazu, mehr Sachen gleichzeitig zu machen, um es mal so auszudrücken. Und dafür braucht man halt irgendeine Syntax. Und klar, es gibt die ganzen Sachen, die man früher machen konnte. Da gibt es die coolen Message-Parsing-Interfaces und die coolen, was weiß ich, verteiltes Rechnen-Ansätze und dann gibt es Threads und Multiprocessing und so weiter.

Johannes

Aber die

Johannes

haben halt alle ihre Nachteile und die haben halt alle

Johannes

ihre, sagen wir mal,

Johannes

Schwierigkeiten.

Johannes

Und gerade wenn man

Johannes

anfängt mit Threads zu arbeiten in Python,

Johannes

merkt man halt sehr schnell, dass das von der Geschwindigkeit her

Johannes

überhaupt gar nichts bringt.

Johannes

Also ist die Frage, was man

Johannes

mit Schwierigkeiten meint, ja,

Johannes

wenn es um

Jochen

quasi wie schnell kann man

Jochen

Dinge machen geht, dann

Jochen

bringt einem das nichts, sondern

Jochen

macht es einfach langsam.

Jochen

Und auch, wie viele Sachen gleichzeitig kann ich machen.

Jochen

Wir helfen einem

Jochen

im Verhältnis in Python ja erstmal gar nichts.

Jochen

Ja, wobei, da würde ich direkt

Jochen

unterscheiden zwischen Sachen

Jochen

parallel machen, das heißt,

Jochen

und Sachen concurrent,

Jochen

und daneben läufig, ja, weiß nicht, ob das eine gute Übersetzung

Jochen

ist, könnte man nicht.

Jochen

Die deutschen Worte sind da total blöd.

Jochen

Weil parallel geht

Jochen

halt in Python nicht, aber ich glaube auch nicht, dass

Jochen

das das Problem ist.

Jochen

Oder geht noch nicht.

Jochen

Da gibt es verschiedene Workloads, glaube ich, die da

Jochen

die du da bedenken musst.

Jochen

Also Multi-Processing ist parallel?

Jochen

Wenn du in Nampai bist, dann hast du ja schon Parallelität.

Johannes

Mit Nampai kriegst du die Cores schon alle voll.

Johannes

Ja, ja, klar, genau.

Johannes

Insofern würde ich sagen,

Johannes

das ist auch nicht so ein Problem.

Johannes

Vielleicht muss man erst noch erklären,

Johannes

was Parallelität und Nebenläufigkeit sind.

Johannes

Ja, bitte, bitte.

Johannes

Einmal kurz da einschränken.

Dominik

Ja, aber ist jetzt Multi-Processing

Dominik

nicht sowas wie parallel?

Dominik

Ja, Multi-Processing ist parallel,

Johannes

aber auch das kannst du nur machen,

Johannes

wenn du wenig Kommunikation hast,

Johannes

weil du da eben zwischen Prozessen kommunizieren musst

Johannes

und das ist langsam.

Johannes

Das ist generell die Krankheit, die du hast,

Johannes

wenn du solche Message-Parsing-Sachen machst.

Johannes

Das hatten wir ja früher auch schon gehabt.

Johannes

Als ich studiert habe, hatten wir einen großen Cluster,

Johannes

der hatte 16 Prozessoren an der Universität.

Johannes

Und das waren halt unterschiedlich, es waren halt 16 Computer,

Johannes

die mit einem schnellen Netzwerk verbunden waren.

Johannes

Aber je weniger Nachrichten du schicken konntest,

Johannes

schicken musstest, umso schneller war das dann halt.

Johannes

Das heißt, im Wesentlichen warst du da gar nicht

Johannes

die CPU gedrosselt,

Johannes

sondern eben durchs Netzwerk.

Johannes

Ja, ja, gut.

Johannes

So ein bisschen ist es bei Multiprocessing ja auch.

Johannes

Je weniger Nachrichten du schicken musst, umso

Johannes

besser. Aber da musst du überhaupt gar keine schicken.

Johannes

Irgendwie, dass man sagt, man hat so

Johannes

eine gemeinsame Verwaltung. Genau, es gibt Chat-Memory.

Jochen

Kannst du einfach wenden. Musst du gar keine Nachrichten schicken.

Jochen

Cool, sowas gibt es schon? Ja, ja. Das ist auch eingebaut.

Jochen

Seit Python 3.8 ist das drin.

Jochen

Also kannst du sagen, hier irgendwie, ja.

Jochen

Umso besser.

Jochen

Aber dann hast du trotzdem noch

Johannes

irgendwelche Locking-Mechanismen, die dir da

Johannes

wo wir halt warten mussten.

Jochen

Aber wenn du CPU-Bauern bist, ist das alles nicht mehr schlimm.

Jochen

Also das ist alles, also ich würde sagen,

Jochen

wenn du Dinge einfach,

Jochen

wenn du jetzt irgendwie Number-Crunch-Geschichten machst,

Jochen

da alle Cores zu verwenden,

Jochen

ist in Python überhaupt kein Problem.

Jochen

Das geht super. Das ist tatsächlich einer

Jochen

der beliebtesten Anwendungsfälle für Python.

Jochen

Also ich würde sagen, Data Science,

Jochen

da ist Python wahrscheinlich die Sprache Nummer 1 gerade.

Jochen

Und das ist ja

Jochen

hauptsächlich so ein Zeugs. Und da geht das super.

Jochen

Da werden immer alle Cores benutzt, gar kein Problem.

Johannes

Ja, klar. Im Wesentlichen ist der Trick halt daran, dass die aus Python rausgehen, die Bibliotheken, und dass die das halt in C machen.

Jochen

Ja, oder du kannst halt auch so Dinge machen, nee, nee, nicht nur. Also du kannst auch pure Python-Funktionen parallelisieren.

Jochen

Also mit REST geht das, auch mit mehreren Maschinen hinweg.

Jochen

Ach so, ja, okay.

Jochen

Aber das ist, also ich habe hier gerade die …

Jochen

Also das ist jedenfalls Parallelität.

Jochen

Ja, genau, das ist Parallelität.

Johannes

Man macht Berechnungen auf mehreren Prozessoren und die sind gleichzeitig im Wesentlichen.

Johannes

Und es spielt keine Rolle, ob es die gleiche Berechnung ist oder

Johannes

eine andere Berechnung. In den meisten Fällen

Johannes

werden es ja die gleichen Berechnungen sein.

Johannes

Und wenn er zuerst fertig ist,

Johannes

dann schreibe ich. Auf allen Zeilen dieser

Johannes

Tabelle möchte ich jetzt ausgerechnet haben,

Johannes

was die Summe ist. Genau, genau.

Johannes

Also ich habe

Jochen

hier die Definition von

Jochen

Rob Pike, von dem

Jochen

jenigen, der sich da

Jochen

mal ausgedacht hat. Und der sagt halt

Jochen

Concurrency is about dealing with

Jochen

lots of things at once.

Jochen

Parallelism is about doing lots of things

Jochen

at once. Not the same, but

Jochen

related. One is about structure,

Jochen

one is about execution.

Jochen

Concurrency provides a way to structure

Jochen

a solution to solve a problem that may

Jochen

but may not necessarily

Jochen

be parallelizable.

Jochen

Ja, das sagt er erst mal.

Jochen

Ich dachte, das hätte ich gerade.

Jochen

Nee, das

Johannes

fand ich jetzt auch nicht arg erhellend.

Johannes

Verdammt, na gut.

Johannes

Ja, Parallelität ist halt

Johannes

Sachen gleichzeitig machen

Johannes

und Concurrency ist verschiedene Sachen

Johannes

machen. Das ist so, wie es in meinem

Jochen

Kopf ist. Ja, eine Erklärung, die ich mal gehört

Jochen

habe, vielleicht ist die besser,

Jochen

vielleicht einfach mal ein paar durchprobieren,

Jochen

ist, dass halt sozusagen

Jochen

ein Bartender

Jochen

kann irgendwie viele Kunden

Jochen

concurrent

Jochen

behandeln, sozusagen, oder wenn ein Bartender

Jochen

viele Kunden hat,

Jochen

die er mit

Jochen

Drinks beschickt, dann

Jochen

ist das irgendwie Concurrency, aber

Jochen

wenn du mehrere Drinks gleichzeitig machen willst, brauchst du mehrere

Jochen

Bartender. Da reicht einer nicht.

Jochen

Und das wäre dann Parallelität, sozusagen.

Jochen

Ja, also mehr

Jochen

Arme für den Barkeeper.

Jochen

In meinem Kopf

Johannes

geht es

Johannes

bei mir ganz viel um das Wort gleichzeitig.

Johannes

Parallelität heißt

Johannes

du machst mehrere Sachen gleichzeitig.

Johannes

Und

Johannes

Nebenläufigkeit oder Concurrency heißt,

Johannes

du machst mehrere Sachen

Dominik

nebeneinander her. Also nicht an einem

Dominik

abschließenden Schritt erstmal den einen Drink mixen,

Dominik

sondern fünf Gläser hinstellen und jedes Mal

Dominik

einmal ein bisschen Zitrone rein und dann ein bisschen

Dominik

Drink. Genau, genau. Also du hast

Dominik

fünf Drinks, die du zubereiten musst und du machst

Johannes

halt die Schritte von denen und du machst erstmal was

Johannes

an dem Drink eins, dann machst du was an dem Drink zwei,

Johannes

dann machst du was an dem Drink drei.

Dominik

Die Gesamtzeit ist

Dominik

dann ja genau dieselbe, als würdest du fünf einzeln

Dominik

machen, nur du hast halt dann fünf

Dominik

gleichzeitig rausgeschickt und alle haben quasi

Dominik

die Zeit gewartet, anstatt dass du jeweils erstmal

Dominik

den ersten, den zweiten, den dritten, den vierten, den fünften

Dominik

Genau, also du machst eventuell die

Dominik

Latenz geringer. Du kannst

Dominik

schon mal die Bestellung des Nächsten

Dominik

annehmen, während ein Drink noch

Dominik

in Bearbeitung ist. Ja, aber dann doch nur die Durchführung.

Jochen

Ja, du kannst halt den Nächsten bearbeiten, während einer noch, weiß ich nicht,

Jochen

in einem irgendeine fürchterliche chemische

Jochen

Reaktion läuft, die halt eine Zeit lang braucht

Jochen

und du wartest halt jetzt nicht stumpf davor ab.

Johannes

Oder du wartest auf den Assistenten.

Johannes

Ja, aber der Erste, der sonst

Dominik

seinen Drink sofort bekommen hätte, weil es erst in der Schlange stand,

Dominik

der muss jetzt länger warten, weil er die anderen Drinks

Dominik

auch nicht hat. Potenziell ja.

Johannes

Aber guck mal, wenn da gerade kein Eis da ist,

Johannes

dann kannst du ja einen anderen Drink

Johannes

machen, während du aufs Eis wartest oder während dir

Johannes

jemand was aus dem Lager holt.

Johannes

Das merkt der erste Kunde überhaupt

Johannes

gar nicht, weil der muss so oder so drauf warten,

Johannes

bis sein Eis da ist.

Dominik

Ja, aber nur dann kannst du was anderes machen.

Dominik

Mit deinen Tasks.

Dominik

Ja, genau, wenn du Wartezeiten hast.

Johannes

Und dann bemerkt der erste

Johannes

Kunde gar nichts. Dann hast du automatisch

Johannes

weniger Latenz und

Johannes

mehr Durchsatz, weil du Wartezeiten

Johannes

nutzen kannst. Und das ist ja eine der großen

Johannes

Allüren dieser

Johannes

ganzen Geschichte, dass du sagst, okay, ich muss jetzt

Johannes

eh auf eine Datenbank warten oder auf

Johannes

die Dateien. Ja, also sobald zwei Leute

Dominik

da arbeiten, also nicht nur den Barkeeper,

Dominik

sondern auch noch die Küche und du möchtest immer einen Drink mit

Dominik

Essen servieren oder sowas. Und solange das Essen noch nicht fertig ist,

Dominik

dann kannst du alle anderen Drinks schon fertig

Dominik

bereiten. Ja, genau. Wenn du Abhängigkeiten

Johannes

hast oder wenn du Wartezeiten hast, die kannst du

Johannes

überbrücken, indem du da was anderes machst. Und das ist

Johannes

Concurrency. Du machst nie Sachen gleichzeitig.

Johannes

Du hast, der Bartender kann nie

Johannes

mehrere Sachen gleichzeitig machen.

Dominik

Dem wachsen keine fünf oder sechs Arme.

Dominik

Genau, der hat halt nur einen

Dominik

Prozessor.

Johannes

Aber der kann mehrere Drinks gleichzeitig zubereiten.

Johannes

Das heißt nicht, dass er überall gleichzeitig was reinschüttet,

Johannes

aber das heißt halt, dass die alle

Johannes

zu einem gleichen Zeitraum in Bearbeitung

Johannes

sind. Genau wie der Jochen sagt, wenn

Johannes

du fünfmal so viele Drinks

Johannes

machen willst, brauchst du halt mehr Bartender.

Johannes

Und die sind dann auch erstmal unabhängig

Johannes

voneinander. Es gibt jetzt leider keine

Johannes

Simdi-Bartender, die

Johannes

mehrere Sachen

Johannes

identisch gleich machen können, dann

Johannes

könntest du fünf identische Drinks

Johannes

gleichzeitig zubereiten.

Johannes

Da wüsste ich jetzt keine

Johannes

Analogie in der

Johannes

echten Welt.

Dominik

Async ist jetzt Parallelität

Dominik

oder Concurrency?

Jochen

Ich würde sagen, dieses Problem Parallelität

Jochen

ist, also dass du

Jochen

beides gleichzeitig brauchst,

Jochen

das wäre jetzt mal eine steile These,

Jochen

ich meine, ich weiß jetzt auch wieder, wann wir das schon mal hatten

Jochen

Und ich glaube, das war tatsächlich in der ersten Sendung, wo ich halt auch meinte, so eigentlich diesen Fall, dass man beides hat, dass man Concurrency braucht und Parallelität, den hat man fast nie.

Jochen

Also, oder mir fällt es schwer, mir dafür einen Use Case auszudenken.

Jochen

Die anderen Fälle hat man, dass man viel Concurrency braucht, hat man, dass man viel Parallelität braucht, hat man, aber beides zusammen.

Dominik

Ja, also ich kann mir jetzt viele Sachen vorstellen.

Dominik

Also wenn ich jetzt beispielsweise vorstelle, autonomes Fahren oder Sport oder sowas.

Dominik

und gleichzeitig fahren bestimmte Menschen

Dominik

übers Eis oder sowas.

Dominik

Und da musst du prognostizieren,

Dominik

was dann passiert. Das ist echt parallel

Dominik

für jeden Einzelnen.

Dominik

Ja, aber das ist nicht concurrent.

Dominik

Du machst das Auto fahren gleichzeitig.

Dominik

Nein, es fahren alle gleichzeitig und alle müssen gleichzeitig

Dominik

darauf reagieren. Und du möchtest ja für alle

Dominik

gleichzeitig irgendwie Werte haben.

Dominik

Du möchtest dann das ganze Team.

Jochen

Das verstehe ich nicht. Tut mir leid.

Johannes

Also du hast mehrere Fahrzeuge.

Jochen

Du hast so einen Rechner, auf den mehrere

Jochen

Fahrzeuge fahren? Das verstehe ich nicht.

Dominik

Genau, du hast die ganze Flotte, die du steuerst.

Dominik

Ja, aber die sind ja unabhängig.

Jochen

Also ich würde sagen, das ist ein Anwendungsfall,

Dominik

den kenne ich so nicht. Aber du hast ein gegnerisches Team

Dominik

und das ist halt nicht unter deiner Kontrolle und du möchtest

Dominik

dann trotzdem alle deine Leute,

Dominik

deren Informationen du dann halt gerade erst

Dominik

live einlesen kannst,

Dominik

dazu bringen, dass sie parallel

Dominik

die Entscheidung treffen,

Dominik

die vernünftig,

Dominik

statistisch wahrscheinlich ja zu besseren

Dominik

Ergebnissen funktionieren, irgendwie so.

Dominik

Der Dominik überspringt

Dominik

so die simplen Schritte.

Dominik

selber fahren können müssen, der macht direkt

Jochen

komplett. Ne, tut mir leid, das würde ich sagen,

Jochen

das ist kein Newscase.

Jochen

Vielleicht doch. Da wüsste ich jetzt auch nicht.

Jochen

Ne, aber

Jochen

wir können ja direkt mal zu einem

Johannes

super guten Newscase zurückgehen und der heißt

Johannes

EVE Online. Da sind ganz viele Spieler,

Johannes

die gleichzeitig Sachen machen wollen

Johannes

und du hast aber trotzdem die große

Johannes

Statustabelle auf dem Server, die du die ganze Zeit

Johannes

aktualisieren musst und das musst du parallel machen.

Johannes

Also ich meine, die Lösung, die EVE Online

Johannes

dafür hat, ist halt, dass sie es langsamer machen.

Johannes

Habt ihr EVE Online mal gespielt?

Johannes

Nee, nur ganz viel drüber gelesen.

Dominik

Oh, ich habe es tatsächlich auch mal ausprobiert.

Dominik

Ich muss gestehen, ich war nicht in den Gruppen.

Dominik

So viel Zeit habe ich nicht.

Dominik

Ja, das habe ich auch nicht geschafft.

Dominik

Aber es gab tatsächlich tolle Schlachten.

Dominik

Also man hat dann so Schlachten gehabt,

Dominik

wo dann so 20.000, 30.000 Schiffe verloren gegangen sind.

Dominik

Und man konnte da ein Business draus machen,

Dominik

weil da konnte man die Schiffe kaufen.

Dominik

Das war richtig Geld, was da vernichtet wurde.

Dominik

Ich glaube, in der größten Schlacht

Dominik

wurden mehrere Millionen Dollar an virtuellem Kapital vernichtet,

Dominik

gleichzeitig, weil man irgendwelche Sprungtouren blockiert hat

Dominik

mit riesigen Flotten an Schiffen

Dominik

und alles in die Luft gesprengt hat,

Dominik

was dann ja nie zu finden war.

Johannes

Ja, das ist das Geschäftsmodell von EVE Online, oder?

Johannes

Ja.

Johannes

Du kannst virtuelle Güter kaufen und sie dann verbrennen.

Dominik

Ja, und du kannst sogar tatsächlich aber in diesem Spiel

Dominik

konntest du halt Echtgelddinger generieren,

Dominik

die du halt verkauft hast.

Dominik

Und wenn du halt ein Wirtschaftsunternehmen,

Dominik

Imperium, in diesem Spiel aufgebaut hast.

Dominik

Es gab eine Leute, ich glaube, die haben über 20.000 Dollar

Dominik

oder sowas im Monat gemacht,

Dominik

indem die für EVE Online Businesses gebaut haben,

Dominik

die sie da durch die Dachen geschleust haben.

Dominik

Und wenn du dann halt sowas gemacht hast,

Dominik

wie einen Krieg zu organisieren zwischen den einzelnen Fraktionen,

Dominik

die sich gegenseitig in die Luft sprengen

Dominik

und das halt alles auf dieser spielerischen Karte,

Dominik

ohne dass das jetzt reale Auswirkungen hätte, also außer

Dominik

wirtschaftliche, für die Jungs, die da vor dem

Dominik

Rechner saßen, dann war das

Dominik

schon irgendwie sehr faszinierende Geschichte.

Dominik

Aber guck mal, Jochen, das ist doch

Johannes

ein perfektes Beispiel, oder? Du hast ganz viele

Johannes

Spieler, die gleichzeitig Sachen machen wollen und

Johannes

du musst aber diese Statustabelle,

Jochen

das ist parallel. Ja, also ich würde sagen,

Jochen

ich bin nicht

Jochen

so der Spielexperte, insofern, keine Ahnung,

Jochen

aber ich würde jetzt mal sagen, Spiele,

Jochen

die sind alle nur concurrent, da brauchst

Dominik

du nichts parallel. Wenn ich jetzt so gegenseitig

Dominik

spiele, ein ganz klassisches Killerspiel,

Dominik

Ja, und wir schießen beide gleichzeitig aufeinander.

Jochen

Aber wo brauchen die denn, wo brauchen die Spiele

Jochen

denn bitte CPU?

Jochen

Die brauchen überhaupt gar keine CPU.

Johannes

Die Spiele heutzutage

Johannes

laufen nicht mehr auf dem Client, sondern die laufen komplett

Jochen

auf dem Server. Ja, selbst wenn die komplett auf dem Server laufen,

Jochen

wo brauchen die denn CPU?

Johannes

Diese vorher genannte

Johannes

Battle, die der Dominik genannt hat,

Johannes

wo dann 30.000 Leute teilnehmen.

Johannes

Der Trick an der Sache, warum das funktioniert,

Johannes

ist, dass die den Timestamp runterdrehen.

Johannes

Das heißt, in so einer Zone, wo viele

Johannes

Leute gleichzeitig sind,

Johannes

Die müssen auf einem Server sein, damit diese Zone kohärent ist. Wenn da zu viele Leute sind, dann tun die so, als ob die Zeit langsamer läuft, weil der Rechner ausgelastet ist.

Johannes

Und wenn die diese Status-Updates parallel abarbeiten könnten auf einem Rechner, dann müssten sie das nicht machen. Die gehen ganz, ganz hart ans Limit, weil die Simulation auf dem Server passiert.

Johannes

zum Teil passiert die Physik-Simulation

Johannes

auf dem Server. Das ist im Wesentlichen

Johannes

der Grund.

Johannes

Man hört ganz oft, dass

Johannes

so und so viele Millionen Leute gleichzeitig in Fortnite

Johannes

sind. Aber das stimmt nicht. Es sind nur

Johannes

höchstens 50 auf einer

Johannes

Instanz. Jetzt

Johannes

gab es so Events, wo 10 Millionen Leute

Johannes

bei so einem Konzert dabei waren.

Johannes

Das ist ein kleines bisschen gelungen. Das waren 250.000

Johannes

Instanzen mit

Johannes

jeweils maximal 50 Leuten, weil da

Johannes

einfach die Auslastung,

Johannes

da ist der Prozessor voll.

Johannes

Und da ist Parallelität einfach ...

Johannes

Okay.

Johannes

Je mehr Parallelität du nutzen kannst,

Johannes

umso höher kannst du diese Zahl setzen.

Johannes

Und umso weniger Instanzen brauchst du.

Johannes

Und das ist richtig, da ist Geld drin und da ist richtig ...

Jochen

Okay, vielleicht weiß ich einfach noch nicht gut genug,

Jochen

wie Spiele funktionieren,

Jochen

dass ich mir gar nicht so richtig vorstellen kann,

Jochen

warum die jetzt CPU brauchen.

Jochen

Also die Frage ist halt, wo ist da der Flaschenhalt?

Jochen

Ist der Flaschenhalt tatsächlich CPU?

Jochen

Das ist dann irgendwie sowas wie Netzwerk.

Jochen

Ich glaube eher Concurrency und Netzwerk, ja.

Jochen

Da müsste man Peer-to-Peer vielleicht machen.

Jochen

Das würde vielleicht schneller gehen,

Jochen

wenn man das irgendwie über Peers verteilt,

Dominik

als dass man irgendwie alles durch einen Hals schickt.

Dominik

Bei allen Leuten irgendwie so ein bisschen was weitergeht.

Dominik

Da gibt es sicher viele Flaschenhälse.

Johannes

Ich glaube, da ist alles, das ist so ein blödes Problem.

Johannes

Wenn du ein Problem gelöst hast, dann kommt direkt das Nächste.

Johannes

Wenn du einen Kopf abgeschlagen hast,

Johannes

wachsen direkt vier neuere.

Johannes

Aber CPU ist da einfach einer der Faktoren.

Johannes

Vielleicht ist es bei Spielen so.

Jochen

Ich kann es noch nicht so richtig nachvollziehen, aber okay.

Jochen

Also ich meine, mir fällt auch ein Beispiel ein,

Jochen

und das sind halt Datenbanken.

Jochen

Da hast du nämlich auch beides.

Jochen

Da hast du halt sowohl I.O.,

Jochen

du hast halt, weiß ich nicht, 30.000, 40.000 Requests pro Sekunde,

Jochen

Und die machen alle CPU.

Jochen

Die machen alle irgendwie

Jochen

Geschichten in irgendwelchen

Jochen

Biotrees irgendwie durchsuchen,

Jochen

irgendwelche Indizes

Jochen

abgleichen,

Jochen

ja, Hashes ausrechnen. Und je mehr

Jochen

du gleichzeitig machen kannst, umso besser.

Jochen

Genau. Also an der Stelle würde ich sagen, also Datenbank-Server

Jochen

und Python schreiben, vielleicht nicht die beste Idee, weil das

Jochen

wird schwierig. Aber... Wie ist es mit

Johannes

Videostreaming? Auch das ist sowas, wo...

Jochen

Würde ich sagen, komplett concurrent. Da gibt es nichts,

Jochen

was irgendwie CPU braucht. Nein, überhaupt nicht.

Jochen

Na klar. Also außer du kodierst irgendwie

Jochen

um, aber ansonsten. Ja, und zwar, und musst

Jochen

du. Du musst die Sachen umkodieren.

Jochen

Dann. Jeder, jeder,

Jochen

jeder moderne Streaming-Dienst,

Jochen

also wir sind jetzt hier auf Whereby,

Jochen

aber wenn du auf BBB gehst oder auf

Johannes

Zoom oder auf sonst was, die kodieren alles um.

Johannes

Tatsächlich

Johannes

machen die Größenskalierungen,

Johannes

damit die Clients mit

Johannes

unterschiedlichen Bitraten versorgen können.

Johannes

Und das kannst du entweder auf dem Client machen, was

Johannes

nicht super zuverlässig ist, weil die Clients

Johannes

halt auch Mobilgeräte sein können.

Johannes

Du machst auf dem Server und dann bist du ganz knallhart

Jochen

Ja, aber da würde ich sagen, da bist du doch sowieso schon

Jochen

da ist der Flaschenhals auch wieder woanders, weil

Jochen

dadurch, dass du

Jochen

dass die einzelnen Clients, die du

Jochen

dran hast, so fett sind

Jochen

macht es doch überhaupt nichts, wenn du pro Verbindung

Jochen

dann halt was Fettes aufmachst, wie ein Prozess oder so

Johannes

Ja klar, aber du hast auf jeden Fall

Johannes

Parallelität, du musst auf jeden Fall

Jochen

diese 8 Streams

Jochen

Das ist auch bei dem Spiel, wenn du sagst, es gehen nur 50 Leute

Jochen

auf eine Instanz oder es gehen nur 50 Streams

Jochen

über einen Rechner, dann machst du halt für die

Jochen

50 Prozesse auf, gar kein Problem, geht das auch mit

Jochen

Ja klar, aber das ist dann schon Parallelität.

Jochen

Also du machst schon viele Sachen gleichzeitig.

Jochen

Ja, aber

Jochen

ein Fall, nach dem ich suche, ist,

Jochen

wo du ganz, ganz viel Concurrency hast,

Jochen

so viel, dass du das mit Prozessen nicht erschlagen kannst,

Jochen

weil es zu viele sind. Also sagen wir mal,

Jochen

du hast 10.000 Verbindungen gleichzeitig.

Johannes

Aber das kannst du ja bei einem Webserver locker mal haben.

Johannes

Ja, natürlich, genau. Also du hast

Jochen

10.000 gleichzeitig, die auch gleichzeitig aktiv sind.

Jochen

Nicht nur einfach eine Verbindung, die rumliegt, sondern tatsächlich

Jochen

aktiv, über die irgendwas drüber geht.

Jochen

Wenn du das Problem hast,

Jochen

plus irgendwie CPU, dann kannst du es vergessen.

Jochen

kriegst du es mit Python nicht mehr hin, weil Prozesse kannst du dann

Jochen

nicht mehr nehmen. Ich glaube, du hast das ausprobiert.

Dominik

Hast du mal so eine Story erzählt auf deinem Mac und

Dominik

hast Kernelpanik verursacht. Kann das sein?

Jochen

Ja, das habe ich jetzt im Zug.

Jochen

Aber das waren Threads tatsächlich, keine Prozesse.

Jochen

Also mit Prozessen wird das gar nicht gehen. 10.000 Prozesse

Jochen

ist nicht möglich. Aber

Jochen

Threads sollten eigentlich möglich

Jochen

sein.

Jochen

Nicht auf dem Mac. Und ich habe es

Jochen

tatsächlich dann auch mal auf einem anderen ausprobiert,

Jochen

um auszuschließen, dass irgendwie meine Hardware leicht defekt

Jochen

ist oder so. Nö, auf Catalina

Jochen

macht das halt sofort Kernelpanik, wenn man 10.000

Jochen

Threads aufmacht. Also die

Jochen

Lüfter gehen kurz an und dann ist der Rechner aus.

Jochen

Ich habe da tatsächlich auch einen Bug bei Apple

Jochen

aufgemacht. Das geht ja so nicht.

Johannes

Ja gut, aber ich meine, wenn man da in die

Johannes

Ecken und Kanten geht. Also ich habe auch schon mal

Johannes

mein Mac mit einem Programm abgeschützt, was nur

Johannes

das Clipboard

Johannes

ausgelesen hat.

Johannes

Ja, es ist

Jochen

ein großes Kartenhaus.

Jochen

Ein großes Kartenhaus.

Jochen

Ja, tatsächlich. Ich habe es dann

Jochen

jetzt auch nochmal auf Linux probiert und so und da

Jochen

geht es problemlos, gar kein Ding.

Jochen

Ja gut, aber so eine Situation

Jochen

wurde 10.000 Threads.

Jochen

Also ich meine, das ist dieses

Johannes

berühmte C10K-Problem.

Johannes

Wie schaffst du es, einen Web-Server

Johannes

zu machen, der 10.000 Clients

Johannes

gleichzeitig benutzen, bedienen

Johannes

kann? Und wenn du

Johannes

das hinkriegst, ist es besser.

Johannes

Weil dann hast du weniger Web-Server.

Jochen

Aber dafür würde ich sagen, brauchst du eben keine CPU, sondern das ist rein

Jochen

Concurrency und das geht

Jochen

problemlos mit einem Prozess

Jochen

und einer zu bringen. Aber ich finde

Johannes

bestimmt irgendeine Workload, wo du noch was berechnen musst.

Johannes

Wo du noch, keine Ahnung, Bilder skalieren musst.

Jochen

Ich glaube auch. Ich glaube, dass es sowas tatsächlich gibt.

Jochen

Aber es ist so einfach, dass man

Jochen

sagt, also ich kenne das ja dann immer so,

Jochen

dass Leute sagen, das ist ja gar keine richtige

Jochen

Problemgespräche. Aber ich meine, wer hat solche Probleme?

Jochen

Also ich hatte sowas

Jochen

ehrlich gesagt noch nie.

Jochen

Und ich habe schon eine Menge Zwergs gesehen.

Jochen

Bei mir war es entweder

Jochen

Vielleicht ist es einfach so,

Jochen

ich glaube, da ist so ein bisschen

Jochen

Selection Bias auch drin, oder?

Jochen

Gut, kann auch sein, ja.

Jochen

Klar, wir haben auch schon viele Sachen gesehen,

Jochen

aber wir sind halt in Python unterwegs

Jochen

und wir sehen nur solche Sachen, die es in Python gibt.

Jochen

Ja, ja, ja, das mag sein.

Jochen

Das kann durchaus, ja.

Jochen

Ja gut, wie auch immer.

Jochen

Wie auch immer, aber genau, diese Parallelität-Ding,

Jochen

also wenn man beides braucht, ist halt schlecht.

Jochen

Das ist nach wie vor nicht gut in Python.

Jochen

Aber sagen wir mal so, dieser Concurrency-Use-Case,

Jochen

für den es ja tatsächlich auch Anwendungen gibt

Jochen

und ich meine, Node.js ist einer der Gründe,

Jochen

warum Node.js so populär ist,

Jochen

ist halt, dass es damit besser ging.

Jochen

oder dafür halt besser benutzt wurde,

Jochen

äh, besser benutzbar war, äh,

Jochen

und, ähm, ja, äh.

Jochen

Ja, auch ein besseres Programmiermodell

Jochen

hat, oder? Also dieses,

Jochen

ähm,

Jochen

Promisers und Futures und so weiter, das,

Jochen

ja, das ist alles schon sehr einfach.

Jochen

Ja, aber das ist eigentlich alles, äh,

Jochen

sozusagen, das gibt's halt in Python ja auch.

Jochen

Ähm.

Dominik

Ja. Was, was gibt's denn da in Python?

Dominik

Gibt's schon, aber. Kannst du das kurz beschreiben?

Jochen

Ja, also gut, okay.

Jochen

Also wenn wir jetzt schon

Jochen

im Grunde wissen, okay, wir wollen das

Jochen

eigentlich schon haben und das ist schon cool und das kann ja

Jochen

wohl nicht sein, dass ich jetzt Node.js lernen muss, nur

Jochen

irgendwie, um immer noch

Jochen

hip zu sein,

Jochen

dann kann man sich ja,

Jochen

genau, kann man so, okay, wie macht Node.js das denn

Jochen

eigentlich, weil Node.js hat

Jochen

die gleichen Beschränkungen im Grunde, ist sehr vergleichbar

Jochen

zu Python, hat die gleichen Beschränkungen,

Jochen

da gibt es auch in GIL,

Jochen

ja, ganz genauso wie in Ruby on Rails

Jochen

und sonst irgendwie in PHP

Jochen

Die ganzen Skript-Sprachen machen das ja alle.

Jochen

Die machen das alle so, weil es halt auch sinnvoll ist.

Jochen

Ja, und weil es halt

Johannes

auch single-threaded die Performance, also wenn du

Johannes

kein Multiprocessing brauchst, also wenn

Johannes

du keine Parallelität brauchst und

Johannes

keine Concurrency, dann ist es halt das Schnellste.

Jochen

Ja, genau. Und was

Jochen

Node.js macht, ist halt,

Jochen

sie haben halt eine Event-Loop und

Jochen

ja,

Jochen

dann kann man halt

Jochen

sozusagen

Jochen

Callbacks auf dieser Event-Loop, oder sagen wir so,

Jochen

das ist halt das, was ganz früher schon immer,

Jochen

ich glaube, das ist schon immer möglich, irgendwie, man kann halt Callbacks

Jochen

auf dieser Event-Loop registrieren, oder?

Jochen

Ja, Callbacks sind ja was Schreckliches,

Jochen

das ist doch die Callback-Hell. Genau, ja.

Jochen

Gar keine richtige, gar keine lineare

Jochen

Programmierung mehr. Hast du was gesagt? Hatte ich irgendwas gesagt?

Dominik

Vielleicht gab es da irgendjemand, der hat was gesagt, der wollte,

Dominik

er wartet noch auf irgendwas. Wie heißt denn das? Wie muss ich

Dominik

dann da fragen, wenn ich das wissen will? Ach, Moment,

Dominik

da steht jemand, der hat da rumgegangen, ach nee, da war noch

Dominik

jemand anders. Ach, Moment, da war noch jemand,

Dominik

der hat aber was gesagt, was dann irgendwie, ach, Callback,

Dominik

ach so, da hinten, ach nee, da unten, ah, oh.

Johannes

kriegst du ja immer. Das Problem ist, dass dein Programm

Johannes

dann auch so aussieht, weil du die Callbacks

Johannes

quasi in der falschen Reihenfolge definieren

Johannes

musst. Du kannst nicht sagen, erst

Johannes

A, dann B, dann C, sondern du musst

Johannes

erst sagen, erst A und wenn es erfolgreich ist,

Johannes

dann B, ansonsten C und wenn

Johannes

B erfolgreich ist, dann zwischendurch

Johannes

D und E und dann hast du A, B,

Johannes

E, F und C

Johannes

kommt dann irgendwo ganz anders. Das heißt, du hast dein

Johannes

Programm nicht mehr, kannst es nicht mehr

Johannes

von oben nach unten lesen,

Johannes

sondern du musst es so gemixt

Johannes

lesen und das ist ganz, ganz, ganz blöd

Johannes

zu programmieren. Und deshalb hat JavaScript dann

Johannes

irgendwann diese Promises und Futures eingeführt,

Johannes

wo du einfach sagen kannst,

Johannes

da kommt jetzt was zurück,

Johannes

was irgendwann

Johannes

fertig ist und

Johannes

sobald du es benutzt, musst du halt warten.

Johannes

Ja, kann man,

Johannes

in Python

Jochen

gibt es das halt quasi ganz genauso.

Jochen

Also seit 3.2

Jochen

gibt es Concurrent

Jochen

Futures.

Jochen

Ich weiß nicht, ob sich

Jochen

JavaScript, das auch so das Promises-Konzept

Jochen

da so ein bisschen abgeguckt hat. Also Python hat sich das

Jochen

abgeguckt aus der Java-Welt tatsächlich,

Jochen

wo es dieses Future-Konzept wohl schon länger gibt.

Jochen

Aber in Java nimmt man doch viel eher Threads, oder?

Jochen

Ja, aber man kann auch

Jochen

das machen.

Jochen

Genau, also aber

Jochen

sagen wir so, wenn wir jetzt schon bei den Callbacks sind,

Jochen

oder bei dieser

Jochen

Art, das kann man halt in Python

Jochen

im Grunde auch so machen.

Jochen

Ja, klar.

Jochen

Ja, also

Jochen

das ist auch in dem Async-Teil, also

Jochen

sagen wir mal so, man muss das wahrscheinlich alles

Jochen

so ein bisschen voneinander unterscheiden, es gibt halt

Jochen

ein riesiges Glossar machen. Ja, genau,

Jochen

wie das unten drunter aussieht, was man unten drunter für

Jochen

einen Mechanismus verwendet, um halt

Jochen

Concurrency zu erreichen und

Jochen

was man dann für Abstraktionen darüber verwendet,

Jochen

weil tatsächlich in Async.io jetzt

Jochen

sozusagen die aktuell

Jochen

in der Standardbibliothek

Jochen

befindliche Lösung für diese

Jochen

Concurrency-Geschichte ist halt

Jochen

Ja, sogar in der Sprache, oder? Ist nicht

Johannes

eine Bibliothek, sondern ist richtig in die Sprache integriert

Johannes

mit Schlüsselwörtern. Ja, aber

Jochen

das ist auch eine

Jochen

gute Sache, das ist voneinander getrennt. Also,

Jochen

was in der Sprache tatsächlich drin ist, ist halt

Jochen

sind halt Async-Funktionen.

Jochen

Also, die man halt mit Async-Dev

Jochen

Async-Dev, genau, und Await

Jochen

mit diesen Schlüsselwörtern

Jochen

kann man da operieren, aber

Jochen

in der Sprache ist nur definiert,

Jochen

dass diese Geschichten dann, wenn du sie

Jochen

aufrufst, halt eine Co-Routine zurückgeben.

Jochen

Es ist nicht gesagt, wie

Jochen

das jetzt alles sonst funktionieren muss. Der Rest ist

Jochen

halt... Ja, okay, klar, die Event-Loop

Jochen

und so weiter. Du kannst nämlich, genau, du kannst halt

Jochen

Async-Dev und Await

Jochen

auch in Trio verwenden. Und Trio verwendet ein ganz anderes

Jochen

Modell unten drunter als jetzt Async-IO.

Jochen

Trio, das

Jochen

ist eine Implementierung

Jochen

sowas Ähnliches wie Async-IO,

Jochen

bloß mit einer

Jochen

etwas moderneren, etwas anderen Zielsetzung.

Jochen

Also es gibt diverse. Es gibt Async-IO,

Jochen

ist in der Standard-Bibliothek. Es gibt

Jochen

Curio, das ist das

Jochen

von David Beasley.

Jochen

Ist halt sozusagen erst ab Python 3.7

Jochen

und irgendwie so ein bisschen

Jochen

advancer.

Jochen

Und dann gibt es nochmal die advancedere

Jochen

Version von Nathaniel Smith

Jochen

im Trio.

Jochen

Und das Ding macht

Jochen

im Grunde sowas ähnliches, aber halt

Jochen

anders. Also die Art, wie man es

Jochen

programmiert, ist halt anders.

Jochen

Und benutzt aber Async-Def kann man

Jochen

in all diesen Dingern verwenden, weil

Jochen

das halt nur sagt, okay, wenn ich

Jochen

eine Async-Funktion habe, dann

Jochen

gibt die halt eine Core-Routine zurück.

Jochen

Und ich kann jetzt damit irgendwas machen. Aber wie das

Jochen

Programmiermodell aussieht, was ich dann mit diesen

Jochen

Co-Routinen mache. Das ist ja demjenigen, der

Jochen

das sozusagen, dieses Framework implementiert,

Jochen

überlassen. Und da gibt es unterschiedliche

Jochen

Ansätze. Und im Grunde

Jochen

Trio ist

Jochen

so ein bisschen das zu Ende gedacht, dass das halt so

Jochen

ein Problem ist. Also das wurde ja auch schon angedeutet

Jochen

mit dieser Callback-Hell-Geschichte. Also

Jochen

das grundsätzliche Problem, was

Jochen

auch der Autor von Trio da identifiziert

Jochen

hat, also ich packe da auch mal

Jochen

einen Artikel, wo man das in Detail nachlesen

Jochen

kann in die Shownotes, dass er sagt,

Jochen

das ist alles, also die Problematik

Jochen

großer Teil der Probleme, die wir hier sehen, sind

Jochen

die gleichen Probleme, die Leute

Jochen

früher mit GoTo hatten.

Jochen

Oder ich sag, das ist halt eine sehr gute

Jochen

Analogie dafür. Wir sind in der Assembler-Welt

Jochen

angekommen, wenn wir über GoTo sprechen.

Jochen

Ja, nee, nicht ganz Assembler.

Jochen

Ganz viele Sprachen, die GoTo haben.

Jochen

Ja.

Jochen

Also,

Jochen

das Problem bei GoTo ist halt irgendwie,

Jochen

dass es dir,

Jochen

was das unmöglich macht,

Jochen

ist halt lokal über Code nachzudenken.

Jochen

Weil du weißt halt nicht, also er hat

Jochen

dann halt so ein schönes Diagramm, wo man halt

Jochen

er macht halt immer, er geht von einem

Jochen

Go-To zu einer Zeile und dann, er macht das halt

Jochen

immer weiter, bis du halt siehst, das ist ein riesiges

Jochen

Spaghetti-Kneuel. Das heißt, du

Jochen

weißt halt nie genau,

Jochen

wie du eigentlich hingekommen

Jochen

bist und wo es hingeht.

Jochen

Und zum Beispiel, du kannst halt keine

Jochen

Tracebacks werfen, weil du weißt überhaupt nicht, wo du herkommst

Jochen

eigentlich. Und

Jochen

das ist halt relativ schrecklich,

Jochen

du musst halt dann das Programm

Jochen

immer komplett verstehen. Ansonsten

Jochen

kannst du nicht sagen, was da gerade passiert

Jochen

weil es keine lokalen Blöcke gibt, wo man sagt,

Jochen

okay, ich habe jetzt ungefähr verstanden, was das Ding tut.

Jochen

Das muss ich jetzt nicht noch,

Jochen

also ich brauche nur zu wissen, wie die Abstraktion davon ist.

Jochen

Und das reicht mir, um damit arbeiten zu können.

Jochen

Zum Beispiel irgendwie sowas wie Print Hello World.

Jochen

Print macht intern was relativ Kompliziertes.

Jochen

Das macht irgendwie Syscalls,

Jochen

das macht irgendwie alle möglichen komischen Dinge,

Jochen

die halt dann so zu tun sind,

Jochen

wenn dann was auf der Konsole erscheinen soll.

Jochen

Aber das muss man

Jochen

alles nicht wissen, sondern man ruft das einfach auf

Jochen

und das geht. Und Funktionen sind halt

Jochen

super, weil genau die brauchst du ja

Jochen

eigentlich nur zu merken, was das Ding tut, aber wie das

Jochen

intern funktioniert, das muss einen nicht mehr interessieren.

Jochen

Ist auch die gleiche Idee bei Klassen und so weiter.

Jochen

Und mit Gotoh funktioniert

Jochen

das halt nicht, weil du nicht sagen kannst,

Jochen

okay, ich weiß jetzt, was hier

Jochen

passiert und muss mir darüber keine Gedanken mehr machen,

Jochen

weil es kann halt passieren,

Jochen

dass dein Code nicht wieder dahin zurückkommt,

Jochen

wo du es, also es gibt nicht so einen Aufruf, der wieder

Jochen

zurückkommt, sondern das kann

Jochen

verschwinden und ist dann halt irgendwie weg und es passiert was völlig

Jochen

anderes. Und das ist halt schlecht, wenn

Jochen

das so ist, weil dann kann man nicht mehr lokal

Jochen

über Code nachdenken. Und

Jochen

er meinte halt so, ja gut, also in den

Jochen

Ende der 60er, 74er

Jochen

Dijkstra und so, da gibt es halt den berühmten Artikel,

Jochen

die haben sich da Gedanken gemacht und

Jochen

deren Vorschlag war halt, ja,

Jochen

Gotoh rauswerfen,

Jochen

verbannen, irgendwie ächten

Jochen

und stattdessen sowas verwenden wie

Jochen

Funktionen und Blöcke und so.

Jochen

Und das hat sich durchgesetzt

Jochen

und auch lustig, die

Jochen

Gegenargumente damals und auch

Jochen

Knut hat zum Beispiel gesagt, oh nö, ich

Jochen

finde Kutu eigentlich ganz gut.

Jochen

Auch sehr interessant.

Jochen

Knut? Ja, Donald Knut.

Dominik

Ah, war das nicht der, der

Dominik

sowas gesagt hat wie Premature

Dominik

Optimization is the root of all evil?

Dominik

Genau, genau der.

Johannes

Aber dieses Zitat ist mit

Johannes

sehr viel Vorsicht zu genießen. Er hat auch gesagt, wenn man

Johannes

drei Prozent rausholen kann, dann ist es nicht mehr

Johannes

Premature.

Jochen

Ja, ja, ach ja, andere Zeiten.

Jochen

Ja, jedenfalls.

Jochen

Genau, der war da auch nicht unbedingt so totaler Fan von Gotoh Rausschmeißen,

Jochen

weil so eines der Argumente war halt so,

Jochen

ja, das bedeutet ja, wir müssen ganz anders programmieren lernen.

Jochen

Wir haben jetzt über Jahre irgendwie,

Jochen

haben wir uns auf ein Level begeben,

Jochen

dass wir damit irgendwie jetzt klarkommen

Jochen

und haben uns so Methoden angewöhnt, wie man damit umgeht.

Jochen

Und wenn wir das jetzt so ändern,

Jochen

dann müssen wir im Grunde nochmal neu programmieren lernen.

Jochen

Und ja, das ist wohl so.

Johannes

Und vielleicht wird es dann sogar langsamer,

Johannes

weil eben diese Funktionsaufrufe

Johannes

und diese ganzen Strukturmechanismen,

Johannes

die verbrauchen ja auch Rechenzeit.

Johannes

Ja, natürlich.

Johannes

Und Speicherplatz.

Johannes

Genau.

Johannes

Und wenn du nochmal 3% irgendwo rausholen kannst,

Johannes

dann kannst du das auch machen.

Jochen

Und wenn der Mainframe super teuer ist

Jochen

und Arbeitskraft super billig,

Jochen

dann macht es vielleicht sogar Sinn.

Jochen

Aber heute vielleicht nicht.

Jochen

Ja, das ist halt,

Johannes

wir stehen auf den Schultern von Riesen.

Johannes

Wir haben heute genügend Prozessoren,

Johannes

Wir haben genügend Megahertz,

Johannes

dass wir uns das leisten können.

Jochen

Ja, und im Grunde,

Jochen

er sagt halt, ja,

Jochen

also bei Concurrent

Jochen

Programmierung

Jochen

hat man im Grunde in gewisser Weise das gleiche Modell

Jochen

und er sagt zum Beispiel, Futures

Jochen

findet er ganz schrecklich, weil

Jochen

die im Grunde das gleiche Problem haben

Jochen

wie Gotoh, weil du kriegst halt was zurück.

Jochen

Also du rufst eine Funktion auf, du kriegst was

Jochen

zurück, aber du bist ja

Jochen

gar nicht, das ist ja gar nicht linear zurück.

Jochen

Dein Code geht ja nicht linear weiter.

Jochen

sondern irgendwo anders passiert

Jochen

irgendwas, das aber

Jochen

durchaus Auswirkungen darauf haben kann,

Jochen

was später in dem Code, der dann

Jochen

jetzt sozusagen von dir aus gesehen weiterläuft,

Jochen

darauf Auswirkungen

Jochen

hat. Das heißt, du musst wissen,

Jochen

okay, der Task, der dann auch läuft, der wird

Jochen

später mal irgendwas Böses machen oder

Jochen

vielleicht noch irgendwie, keine Ahnung. Und da muss ich auf jeden Fall

Jochen

dran denken, dass der mir vielleicht irgendwie dazwischen

Jochen

grätscht oder ich muss hier mal einen Lock setzen, damit das irgendwie

Jochen

atomar bleibt und keine Ahnung.

Jochen

Das heißt,

Jochen

ich kann nicht mehr sagen, okay,

Jochen

ich habe jetzt diese Funktion aufgerufen,

Jochen

ist es gut, ich weiß jetzt Bescheid,

Jochen

es hat funktioniert oder nicht

Jochen

und ich mache jetzt weiter, sondern

Jochen

ja, ich habe dieses Future-Ding in der Hand,

Jochen

aber tatsächlich muss ich

Jochen

mir irgendwie selber merken, was da noch alles

Jochen

passieren kann und das ist natürlich schlecht,

Jochen

weil das macht halt genau diese lokale,

Jochen

dieses lokale Nachdenken

Jochen

über Code kaputt und er sagt

Jochen

halt so, alle Concurrency-Lösungen, die

Jochen

dazu führen, dass man nicht mehr lokal

Jochen

über Code nachdenken kann, das ist

Jochen

alles, das ist alles nicht richtig,

Jochen

Das sollte man so nicht machen.

Jochen

Was ist da die Lösung jetzt davon?

Jochen

Er hat da so ein Konzept,

Jochen

das heißt dann irgendwie

Jochen

Nurseries.

Jochen

Nurseries, die kleine Krankenschwester,

Jochen

die die Babys auf der Aufzuchtstation ist.

Jochen

Genau, er sagt so, ja, so Tars

Jochen

oder sind so wie so kleine Kinder,

Jochen

die darf man nicht einfach so frei rumlaufen lassen,

Jochen

das ist nicht gut.

Jochen

Die muss man irgendwo einsperren,

Jochen

wo sie dann gepflegt werden.

Jochen

Wo sich jemand drum kümmert.

Jochen

die dürften aber nicht raus. Ja, genau.

Jochen

Und das Ganze ist in so einem Context-Manager drin

Jochen

und tatsächlich, also ich habe noch nicht

Jochen

so viel damit rumgespielt. Also es sah gut aus, aber

Jochen

ja, angeblich

Jochen

ist das wohl eine Möglichkeit,

Jochen

das so hinzukriegen, dass

Jochen

dass man weiterhin lokal über Sachen nachdenken kann

Jochen

und dieses Problem, dass man

Jochen

Spalter-Effekte hat, gar nicht mehr bekommt.

Jochen

Und es ist sogar teilweise

Jochen

einfacher, Sachen damit umzusetzen.

Jochen

Es gibt da diesen für IP

Jochen

Happy Eyeballs-Algorithmus,

Jochen

der auch in Twisted drin ist. Und es gibt eine Twisted-Implementierung,

Jochen

die ist 120 Zeilen

Jochen

und relativ fies. Und es gibt eine

Jochen

in Trio und die ist halt irgendwie,

Jochen

weiß ich nicht, also ich meine, obwohl Zeilen

Jochen

vergleichen ist auch wieder ein bisschen Quatsch, aber

Jochen

also viel, viel weniger und viel

Jochen

klarer. Und als er das Ding

Jochen

in Trio nachgeschrieben, hat er auch diverse logische Fehler

Jochen

in der Twisted Implementation

Jochen

gefunden, weil das einfach

Jochen

super schwierig ist, das so hinzukriegen

Jochen

mit den Futures. Also in

Jochen

Trio gibt es keine Futures mehr,

Jochen

es ist halt eher so, es gibt diese Nurseries

Jochen

und ja, es wurde auch schon

Jochen

darüber nachgedacht, ob das nicht vielleicht eine gute Geschichte

Jochen

wäre, das in

Jochen

Python direkt einzubauen

Jochen

und statt AsyncIO zum Beispiel

Jochen

zu verwenden, aber das ist alles

Jochen

noch gerade so dabei,

Jochen

quasi noch nicht sprunghaft.

Jochen

Ist der Zug nicht schon längst abgefahren?

Jochen

Vielleicht schon, ja.

Jochen

Ja, vielleicht ist er das schon.

Jochen

Viel zu viele Leute, oder zu viele Leute

Jochen

verwenden Async.io, als dass man

Jochen

das noch vielleicht ändern könnte. Und es gibt halt da

Jochen

diesen Ökosystem-Split und

Jochen

wahrscheinlich ist es besser, dann eben

Jochen

auf das zu versetzen, was eh dabei ist.

Dominik

Trio macht das sowas, du hast jetzt gesagt,

Dominik

Kontextmanager, das heißt, man muss diesen lokalen Scope

Dominik

nicht verlassen. Ist das nicht eigentlich das, was Funktionen

Dominik

tun, sowieso schon?

Jochen

Ja, ja, aber Funktionen funktioniert halt nicht so richtig.

Jochen

Weil?

Jochen

Die Tats laufen ja weiter.

Jochen

Das ist halt auch bei

Jochen

wenn du halt eine Funktion

Jochen

wenn du

Jochen

Concurrence irgendwas machst, dann

Jochen

hört das halt nicht in dem Moment auf, wo du das

Jochen

aufgerufen hast, sondern das läuft halt unter Umständen weiter.

Dominik

Das heißt, ich habe beispielsweise nur

Dominik

den halben Whisky eingeschenkt und die andere

Dominik

Hälfte, die kommt aber noch.

Dominik

Aber woanders fängt der halt an, dann schon

Dominik

andere Limetten rein zu

Jochen

Ja, also

Dominik

Und was ist der Unterschied?

Dominik

in Trio, dann macht er dann trotzdem erst den einen Schritt fertig?

Dominik

Oder wieso ist das so isoliert?

Dominik

Also, dass du vielleicht bei diesem Barkeeper-Beispiel

Dominik

das so anschaulich hinzubekommen

Jochen

kriegst? Weiß nicht, ob ich das tatsächlich hinkriege.

Jochen

Also, kann man sich, müsste man

Jochen

sich selber angucken. Da gibt es auch Schaubilder auf der Seite.

Jochen

Aber das zu erklären,

Jochen

weiß ich nicht, ob das... Das ist so ein bisschen das Problem,

Jochen

das generelle Problem an Current Programming,

Johannes

oder? Dass diese Sachen alle gleich so kompliziert

Johannes

werden, dass man dann diverse Schaubilder

Johannes

braucht und Leute dann

Johannes

irgendwann sagen, ja, lass lieber die Finger davon,

Jochen

das ist nicht so. Ja, und tatsächlich ist das

Jochen

vielleicht gar keine so schlechte, ich glaube, ich würde auch sagen, also auch meine

Jochen

Erfahrungen, die ich damit so bisher gesammelt habe,

Jochen

die waren alle immer, es war immer

Jochen

ziemlich fies, also das war immer,

Jochen

also die Beispiele,

Jochen

die haben immer funktioniert, wenn man sich irgendwie

Jochen

so Tutorials oder so anguckt, wenn man es

Jochen

dann tatsächlich ausprobiert mit irgendwie

Jochen

in den Fällen, wo man es dann halt

Jochen

wirklich braucht, wo man dann viel Last macht,

Jochen

dann sind mir jedes Mal

Jochen

passieren komische Sachen

Jochen

und das Debugging ist jedes Mal

Johannes

Das ist so bei Ginkgo Program, da passieren immer

Jochen

komische Sachen. Ja, also wirklich, also

Jochen

zum Beispiel einen Bug

Jochen

und diese

Jochen

Geschichten, ich meine, das passiert anderen Leuten auch.

Jochen

Zum Beispiel

Jochen

der Gründer von

Jochen

der ursprünglichen Entwickler von

Jochen

Twisted hat einen langen Artikel darüber geschrieben,

Jochen

warum er Multithreading hasst.

Jochen

Wo er dann geschrieben hat, sie hatten

Jochen

also Probleme und sie hatten dieses

Jochen

sie hatten einen wirklich fiesen Bug

Jochen

in einem größeren System und

Jochen

der ist halt irgendwie nur

Jochen

ab und zu aufgetreten. Sie haben es überhaupt niemals

Jochen

reproduzieren können und sie sind es nicht losgeworden.

Jochen

Und sie haben alles

Jochen

from scratch nochmal neu geschrieben,

Jochen

reimplementiert, um den Bug wegzukriegen,

Jochen

weil sie ihn einfach über Monate nicht finden konnten.

Jochen

Und das ist eigentlich schon echt bitter.

Jochen

Es ist auch super schwer

Jochen

zu testen, so Zeug. Das ist auch super schwer

Jochen

zu sagen, wenn ich X mache und Y,

Johannes

dann passiert Z. Sondern es ist halt,

Johannes

wenn 37 Leute gleichzeitig X machen

Johannes

und einer von denen aber Z macht und

Johannes

einer von denen Y und

Johannes

23 A und B, dann

Johannes

passiert irgendwas.

Johannes

Und Buchstabensuppe.

Johannes

Aber dann passiert Buchstabensuppe und das ist ein Bug.

Jochen

Ja, was ich

Jochen

da mal hatte, war halt, genau,

Jochen

ich hab halt so was Webcrawler-artiges

Jochen

geschrieben und

Jochen

mit ein paar tausend Seiten und

Jochen

weiß ich nicht, so hundert

Jochen

Seiten gleichzeitig abfragen pro Sekunde oder so,

Jochen

alles gar kein Problem. Aber so, okay,

Jochen

gehen wir auf eine halbe Million oder eine Million und machen

Jochen

das mal so irgendwie ordentlich, so mit ein paar tausend

Jochen

pro Sekunde. Und dann passieren

Jochen

plötzlich seltsame Geschichten.

Jochen

Irgendwie sterben plötzlich

Jochen

Sachen oder was ich dann hatte, es wird

Jochen

plötzlich irgendwie seltsam langsamer.

Jochen

Man weiß nicht warum. Plötzlich

Jochen

kriegt man ganz eigenartige

Jochen

Tracebacks aus den Tiefen von Python.

Jochen

Also was ich dann irgendwie

Jochen

rausgefunden habe,

Jochen

das war halt irgendwie die Resolver-Library

Jochen

auf meinem Mac. Ich habe es auf dem Mac probiert.

Jochen

Die hat halt irgendwie angefangen, plötzlich Probleme

Jochen

zu machen. Und

Jochen

zum Glück auf Linux ging es dann. Das ist auch

Jochen

immer sowas. Ja, Mac gibt es dann

Jochen

vielleicht für Smoketest gar nicht

Jochen

so schlecht. Der macht dann irgendwie

Jochen

ein bisschen früher irgendwie

Jochen

fängt er an zu rauchen.

Jochen

Bei Linux gehen dann viele Sachen, wo der Mac

Jochen

dann schon raucht, aber

Jochen

das war, und da habe ich auch lange dran rumgedebuggt

Jochen

und nichts gefunden und das ist ganz schrecklich.

Jochen

Ja, Load macht

Johannes

Dinge kaputt, die

Johannes

schwer zu finden sind und schwer zu sehen

Johannes

sind.

Johannes

Die dann auch nur so sporadisch auftauchen.

Johannes

Da wird es dann auf einmal statistisch, wenn du

Johannes

sagst, okay, mein Programm geht

Johannes

in 99 Prozent

Johannes

der Abläufe.

Dominik

Das ist dann der echte Bug. Das ist dann wie, dass in der Schaltung

Dominik

irgendwo ein Käfer reingeklettert ist,

Dominik

weil die Schaltung so groß ist, dass da irgendein Käfer dazwischen

Dominik

passt und du weißt aber nicht, woran er liegt.

Dominik

Ja, wenn halt der DNS-Resolver nur 99 Prozent aller Anfragen

Johannes

korrekt beantwortet und in einem Prozent der Anfragen

Johannes

halt abstürzt oder irgendeinen Quatsch macht,

Johannes

dann hast du halt so statistische

Johannes

Dinge. Aber das ist natürlich sehr unbefriedigend,

Johannes

weil ja eigentlich,

Johannes

also als Softwareentwickler

Johannes

oder als Informatiker ist man ja gewöhnt, dass wenn es

Johannes

geht, dass es dann zu 100 Prozent geht und

Johannes

immer.

Jochen

Ein anderes Beispiel, eben

Jochen

Lukas Langer, der hat ja bei Facebook

Jochen

gearbeitet und hat dann auch so ein Beispiel für,

Jochen

sie hatten halt irgendwie ein Ding, was halt auch

Jochen

Async.io gemacht hat und dann

Jochen

haben sie da auch Durchsatz,

Jochen

wenn es anfing, so richtig Durchsatz zu machen,

Jochen

wurde es plötzlich irgendwie magisch

Jochen

langsamer.

Jochen

Das sind die schlimmsten Sachen.

Jochen

Sie haben dann irgendwie auf ihre Kurven geguckt

Jochen

und sie haben es nicht verstanden und dann, bis dann

Jochen

irgendwann jemandem aufgefallen ist, oh,

Jochen

wo kommen eigentlich diese Kurven her?

Jochen

Es gibt da halt noch einen Thread, der guckt sich halt an, was die anderen Threads so machen und was die anderen Tasks so machen. Und der hatte halt in der Art, wie er dann halt die Ergebnisse von dem, was er gesehen hat, wie er sammelt hat, irgendwie so einen naiven Algorithmus drin, der mit der Last nicht gut klargekommen ist.

Jochen

der dann halt schnell langsamer

Jochen

geworden ist und der wurde dann so langsam, dass er alles andere

Jochen

aufgehalten hat und da ist dann

Jochen

sozusagen die CPU rausgelegt

Jochen

und ja, also

Jochen

aber das sind alles so ganz ekelhafte

Jochen

Probleme, also das ist

Jochen

wenn man das nicht braucht, sollte man das nicht machen, glaube ich

Jochen

das wäre so

Jochen

Ja, oder halt sich möglichst

Jochen

weiter von fernhalten, also ich meine, wir

Johannes

sind ja Django-Entwickler und wir haben das ja schon lange

Johannes

wir haben ja schon lange

Johannes

Sachen, die konkurrent sind, weil wir halt

Johannes

wenn du irgendwo was deployst, dann machst du halt

Johannes

zehn Unicorn-Prozesse an oder so.

Johannes

Aber die sind ja im Wesentlichen

Johannes

unabhängig voneinander.

Johannes

Die kommunizieren

Johannes

nur über die Datenbank. Die Datenbank ist

Johannes

da das, was die Currency macht.

Johannes

Oder was die gleichzeitig

Jochen

hat. Dass die Datenprobleme löst, dass das isoliert ist.

Jochen

Genau. Da bin ich ganz froh, dass es

Jochen

eine gute Datenbank gibt.

Jochen

Genau. Wo ich einfach sagen kann, okay,

Jochen

das kann ich messen, wie lange braucht

Jochen

es, diese Query auszuführen

Jochen

und wie viele können das gleichzeitig. Und wenn da zu viele

Jochen

Leute gleichzeitig kommen, dann müssen die halt warten.

Johannes

Wenn dann zu viele da sind, dann muss man halt die Timeouts hochstellen und sagen, fertig. Aber das ist so ein bisschen Concurrency Light, weil du eben die Sachen so sehr voneinander abtrennst, beziehungsweise das ist die smarte Concurrency. Du trennst die Sachen so weit voneinander ab, dass sie unabhängig voneinander sind.

Johannes

Und wenn sie so unabhängig voneinander sind, dass sie sich gar nicht, dass sie keine Kommunikation machen müssen, dann kannst du sie auf verschiedenen Rechnern ausführen, dann kannst du sie skalieren, kannst du sie wegskalieren, ja, entweder über Prozesse oder über Prozessoren, über unterschiedliche Maschinen oder über, was weiß ich, Docker-Container, die dir dann, oder über einen Kubernetes-Cluster, ja, wo du dann halt im Prinzip das Gleiche an ganz vielen verschiedenen Stellen ausführst und das ist ein Modell.

Jochen

Ja, aber nehmen wir jetzt mal den Fall, du willst jetzt eben sowas machen wie zum Beispiel, keine Ahnung, was mit Felix Elixier und Liveview geht, du hast halt eine Webseite und pushst den Leuten quasi reaktiv irgendwie Dinge in den DOM und du hast dann natürlich eine Websocket-Connection zu jedem Client und das können ja dann Tausende sein oder Zehntausende, dann musst du all diese Verbindungen irgendwie handeln, musst damit was machen.

Jochen

wenn du jetzt dieses klassische Worker-Modell

Jochen

mit Unicorn machst, das geht auch,

Jochen

dann hast du aber irgendwie einen Haufen

Jochen

Verbindungen und brauchst einen Haufen Server.

Jochen

Wahrscheinlich kannst du es auch

Jochen

mit einem machen. Ja, da würde ich

Jochen

mir einfach wünschen, dass es sozusagen so eine

Jochen

Verbindungsdatenbank

Jochen

gibt,

Jochen

die dieses schwierige Problem

Johannes

wegabstrahiert, aber ich glaube, da gibt es noch nichts.

Johannes

Ja, aber tatsächlich

Jochen

mit Django 3.1

Jochen

Async Views geht das tatsächlich.

Jochen

Also ich meine, man kann auch einfach was anderes nehmen.

Jochen

Also, womit man das schon länger machen kann, ist

Jochen

wahrscheinlich sowas, wie man Starlet nimmt

Jochen

oder so, oder irgendwas in der

Jochen

Richtung. Ja, aber die nennen ja auch alle Async.io.

Jochen

Also, die machen ja auch keine Magie. Genau,

Jochen

genau, genau. Aber da ging das halt,

Jochen

Django ging es bisher halt noch nicht, bis,

Jochen

also jetzt geht es halt dann halbwegs. Was

Dominik

macht Django denn jetzt alles so Schönes? Genau,

Dominik

jetzt

Jochen

kann es, also was neu

Jochen

dazukommt, sind Async-Views,

Jochen

wo man halt

Jochen

sozusagen als View tatsächlich eine

Jochen

Funktion hat, oder eben auch eine Klasse, wo man dann halt

Jochen

die Call-Methode als async

Jochen

def markiert,

Jochen

also async-Funktionen hat, die

Jochen

Views sind und

Jochen

die dann

Jochen

Co-Routinen zurückgeben und

Jochen

dafür muss das Interface,

Jochen

also das ist bei mir schon mit Django 3.0 passiert,

Jochen

das Interface zum Server,

Jochen

es muss möglich sein, was anderes zu benutzen als BSGI

Jochen

und das, was man da verwendet,

Jochen

ist halt dann ASGI

Jochen

und das kann halt

Jochen

beide Richtungen und

Jochen

ja, ist halt...

Dominik

Also Web-Server, Gateway-Interface und Asynchronos-Server.

Dominik

Ja, genau.

Jochen

Ist sozusagen das Übertragen auf den Fall,

Jochen

den man jetzt halt dann hat.

Jochen

Und genau, kommt auch aus dem Channels-Projekt irgendwie.

Jochen

Andrew Godwin hat das Ding halt auch in den Standard irgendwie dafür

Jochen

sozusagen hauptsächlich, glaube ich, irgendwie geschrieben.

Jochen

Ist jetzt in der Version 2.0 oder sowas da

Jochen

und ist auch mehr oder weniger fertig

Jochen

und wird auch von allen anderen quasi so adaptiert.

Jochen

Also das hat sich wohl tatsächlich mittlerweile eigentlich als Standard

Jochen

für solche...

Jochen

Hat sich durchgesetzt.

Jochen

hat sich durchgesetzt für, das ist halt

Jochen

der Standard, wie jetzt ein Applikationsserver mit der

Jochen

Applikation irgendwie kommuniziert.

Jochen

Und, genau.

Jochen

Und

Jochen

was in Django 3.1 jetzt dazugekommen ist,

Jochen

sind die Views, das ging halt

Jochen

in 3.0 noch nicht.

Jochen

Middlewares,

Jochen

und das war halt auch einer der

Jochen

schwierigen Teile halt, das Problem ist, du musst

Jochen

halt es hinkriegen, also wenn

Jochen

eine synchrone Middleware dazwischen ist, dann geht es halt schon eigentlich

Jochen

nicht mehr. Die ganzen

Jochen

ein Middle-Wise-Async zu kriegen

Jochen

und

Jochen

auch Async-Tests gehen halt

Jochen

auch. Und damit

Jochen

ist halt tatsächlich schon mal was da, womit man

Jochen

was machen kann. Ich meine, tatsächlich

Jochen

also die Wunschvorstellung, die ich an das Ganze hätte,

Jochen

eigentlich ist da so, dass

Jochen

alle Dinge, die jetzt I.O. machen auf meinem Server,

Jochen

also normale Webseite, kommt

Jochen

ein Request rein, das Ding

Jochen

macht halt irgendwie, keine Ahnung,

Jochen

fünf Statements an den Datenbank,

Jochen

fragt irgendwie

Jochen

ein Redis-Cache, fragt

Jochen

noch irgendeine API oder sowas

Jochen

und gibt dann irgendwie eine Antwort zurück

Jochen

in einem View und momentan ist es

Jochen

halt so, da wartet man dann halt

Jochen

synchron auf jede einzelne Anfrage, die man

Jochen

irgendwo hinstellt und alle Latenzen addieren sich

Jochen

und

Jochen

bis man das erste Byte am Client

Jochen

empfängt, muss man halt diese ganzen

Jochen

Netzwerk

Jochen

Zeiten

Jochen

abgewartet haben und

Jochen

das kann halt sein, dass das dann irgendwann, wenn man viele

Jochen

Statements macht oder wenn man viele APIs fragt,

Jochen

dann wird das halt viel und man kann

Jochen

im Grunde nichts tun, so wirklich.

Jochen

Oder man muss es halt komplett selber machen. Das Framework

Jochen

gibt einem da nichts an die Hand, womit man das

Jochen

irgendwie verbessern kann.

Jochen

Und sozusagen in einer goldenen

Jochen

Zukunft wäre es halt

Jochen

vielleicht so, dass man sagt, okay,

Jochen

das wird alles Async

Jochen

zusammengesammelt. Alle Sachen, die

Jochen

I.O. machen nach außen,

Jochen

erwartet man halt.

Jochen

Und

Jochen

die Latenz, die man

Jochen

als Client, wenn man die Seite

Jochen

abfragt, zu sehen bekommt,

Jochen

ist die, die der längste IO-Ding nach draußen braucht.

Jochen

Aber alle anderen sind dann halt schon da.

Jochen

Das heißt, es ist nicht mehr, alle Latenzen addieren sich,

Jochen

sondern die Latenz, die man sieht,

Jochen

ist die von dem längsten Einzelteil sozusagen.

Jochen

Ja.

Johannes

Aber ist das jetzt nicht Parallelität?

Johannes

Nö, das ist Concurrency.

Jochen

Das ist alles immer nur, genau.

Jochen

Weil ich sehe da,

Johannes

ich sehe echt einen ganz anderen Anwendungsfall

Johannes

für diese Async-Views und Async-Middlewares und so weiter.

Johannes

Ich sehe halt, dass du lange laufende Views hast

Johannes

und nicht den Worker blockierst.

Johannes

Das heißt, du kannst derweil andere Clients behandeln.

Johannes

Ja, das gibt es natürlich auch.

Johannes

Das ist ja genau das, was du bei WebSockets brauchst.

Johannes

Du hast ja im Wesentlichen einen Request,

Johannes

der für immer läuft.

Johannes

Oder so lange, wie der Client halt da ist.

Johannes

Und zwischendurch kannst du aber was anderes machen.

Johannes

Und der kann prinzipiell ja dann auch mit anderen Views

Johannes

kommunizieren. Du hast dich gerade

Dominik

freiwillig gemeldet, nochmal zu erklären, was WebSockets sind

Dominik

und weil das

Dominik

kam heute noch gar nicht dran.

Dominik

Ja, WebSockets sind, also

Dominik

da muss man ein kleines bisschen

Johannes

ausholen, glaube ich, weil

Johannes

das, was man so als Webseite kennt,

Johannes

das hat so ein Modell, das heißt Request Response.

Johannes

Das heißt, du schickst eine Anfrage

Johannes

hin und der Server

Johannes

bearbeitet die und dann schickt er irgendwann eine Antwort

Johannes

zurück und dann ist das abgeschlossen.

Johannes

Das ist alles, was

Dominik

da passiert. Also das, was man so hinschickt, ist dann so

Dominik

eine Anfrage, entweder will man irgendwie aus dem

Dominik

klassischen Crowdstream irgendwas machen, also

Dominik

lesen oder schreiben oder

Dominik

updaten oder löschen oder sowas und dann

Dominik

bekommst du eine Antwort, die

Dominik

dann irgendwie so einen Statuscode hat, den man vielleicht irgendwie so

Dominik

kennt. Genau, das ist

Johannes

alles Feinheiten, die da drin sind.

Johannes

Dieser Request-Response-Zyklus ist einfach nur,

Johannes

ich schicke dir eine Anfrage hin,

Johannes

einen Arbeitsauftrag und der

Johannes

Server bearbeitet diesen Arbeitsauftrag und

Johannes

schickt dann das Ergebnis zurück. Und was da drin steht,

Johannes

spielt erstmal keine Rolle. Das kann sein,

Johannes

gib mir die Homepage, das kann auch sein,

Johannes

update alle Bilder in der Datenbank

Johannes

und es kann auch sein,

Johannes

lösche alle, was weiß ich.

Johannes

Das spielt erstmal keine Rolle,

Johannes

sondern das Wichtige ist,

Johannes

das ist eine abgeschlossene Welt.

Johannes

Ich schicke eine Anfrage hin

Johannes

und die wird bearbeitet

Johannes

und dann wird sie zurückgeschickt.

Johannes

Und wenn ich eine neue Anfrage hinschicke,

Johannes

dann hat die mit der vorherigen erstmal gar nichts zu tun.

Johannes

Man muss dann Tricks benutzen,

Johannes

damit da sozusagen so eine Kohärenz da ist,

Johannes

dass ich der eingeloggte Benutzer bin.

Johannes

Aber im Endeffekt sind das alles Tricks,

Johannes

um einzelne Request-Responses, um einzelne solche Zyklen so zu machen,

Johannes

dass die ausschauen, als ob sie zusammengehören.

Dominik

Du meinst sowas wie Session oder sowas?

Johannes

Genau, das mit Cookies, wo du dann so eine Session-ID hast,

Johannes

dann kannst du simulieren, dass diese verschiedenen Requests alle zusammengehören.

Johannes

Aber im Endeffekt sind die alle unterschiedlich.

Johannes

Die könnten alle an einen anderen Web-Server gehen

Johannes

und es würde trotzdem funktionieren.

Johannes

Und das ist in ganz vielen Fällen auch der Fall.

Johannes

naja, wenn du bei Google die Hauptseite abrufst

Johannes

und danach die Suche abschickst,

Johannes

wirst du sicherlich nicht vom gleichen Rechner bedient werden.

Johannes

Beziehungsweise du wirst eventuell sogar von ganz vielen Rechnern

Johannes

gleichzeitig bedient werden,

Johannes

weil die natürlich intern ganz viel Geschwindigkeit zahlen.

Johannes

Aber das spielt gar keine Rolle.

Johannes

Für dich als Client, als Browser,

Johannes

ist die Welt eine ganz einfache.

Johannes

Du schickst eine Anfrage und dann kriegst du eine Antwort zurück.

Johannes

Und dann ist das abgeschlossen.

Johannes

Und wenn du danach was Neues brauchst,

Johannes

schickst du eine neue Anfrage, kriegst du eine neue Antwort zurück.

Johannes

Bei WebSockets ist es anders. Bei WebSockets machst du eine Verbindung auf und diese Verbindung bleibt dann bestehen. Und du kannst dann über diese Verbindung Daten an den Server schicken. Der Server kann aber auch selbstständig Daten an dich schicken. Und das löst so ein Problem, was man früher hatte, wenn diese klassische, das klassische Beispiel ist eine Chat-Anwendung, wo halt einer was in sein Chat-Fenster eintippt und die anderen sollen das dann sehen.

Johannes

Und bei einem Request-Response-Mechanismus heißt es, dass die halt die ganze Zeit fragen müssen, gibt es schon was Neues, gibt es schon was Neues, gibt es schon was Neues und der Server die ganze Zeit Nein sagt und irgendwann sagt er halt Ja, weil da irgendjemand anders was eingetippt hat.

Johannes

Viel besser wäre es aber doch, wenn die alle sagen, ich bin jetzt hier und ich möchte gerne alle Nachrichten aus dem Chatraum hören und sobald es eine neue Nachricht in diesem Chatraum gibt, sagt der Server allen angeschlossenen Clients, hier ist was Neues.

Johannes

Dafür braucht man aber so eine bestehende Verbindung. Das heißt, dafür kannst du nicht nur sagen, beantworte mal die Anfrage, gibt es was Neues, sondern da ist die Anfrage, informiere mich, sobald es was Neues gibt.

Johannes

Man hat da früher ganz schlimme Technologien gemacht. Man hat dann irgendwelche Long-Polling-Requests gemacht oder irgendwelche Meteor-Sachen, die HTTP so ein bisschen verbogen haben, um das eben hinzukriegen.

Johannes

Und hat dann irgendwann WebSocket zum Standard gemacht, was im Wesentlichen das macht. Das ist eine HTT, das ist erstmal eine normale HTTP-Anfrage, die dann upgradet wird, damit die Verbindung nicht geschlossen wird. Und diese Verbindung bleibt dann bestehen und ist dann bidirektional. Das heißt, der Client, der Browser kann Nachrichten schicken. Es muss nicht unbedingt ein Browser sein, kann auch was anderes sein. Und der Server kann aber auch Nachrichten schicken.

Johannes

Und dadurch wird eben so dieses Modell, dieses Programmiermodell, was man früher hatte, ein Request kommt rein, erzeugt eine Response, ausgehebelt, weil ein Request kommt rein, heißt, wir verbinden, wir machen jetzt eine Verbindung auf und danach können sehr viele Responses darüber gehen.

Johannes

Da können auch noch neue Requests drüber kommen, weil der Client halt, weil jemand was in sein Chatfenster eingetippt hat und der Client sagt dann, bitte veröffentliche das in diesem Kanal.

Johannes

Das heißt, WebSockets sind so ein bisschen die Erweiterung,

Johannes

ja nicht eine Erweiterung, sondern eine Möglichkeit,

Johannes

rohere Netzwerkverbindungen zu haben,

Johannes

länger bestehende Netzwerkverbindungen zu haben

Johannes

aus normaler Browser-Hardware, aus normaler Browser-Software aus.

Johannes

Es gibt inzwischen auch ganz viele andere Clients,

Johannes

die WebSockets verwenden.

Johannes

Die meisten Native-Anwendungen werden mit ihren Servern über Websockets kommunizieren, weil das eben der Standard ist.

Johannes

Wie macht man sowas in Django?

Johannes

In Django macht man sowas erstmal gar nicht.

Johannes

Beziehungsweise jetzt in 3.1 kann man das eventuell machen.

Johannes

Die Websocket-Verbindung muss vom Client aufgebaut werden.

Johannes

Das heißt, der Client muss sich irgendwo anmelden und sagen, hier, ich möchte gerne einen Websocket haben.

Johannes

und dafür gab es eben in Django

Johannes

diese Erweiterung, die Channels heißt, weil

Johannes

Django selber kann das nicht. Django selber hat nur den

Johannes

Request-Response-Mechanismus.

Johannes

Das ist

Johannes

sofort ersichtlich, wenn man die erste View-Funktion schreibt,

Johannes

weil die eben einen Request

Johannes

kriegt. Und das ist genau der Request, der vom Browser

Johannes

geschickt wird. Der sagt, mach mal

Johannes

bitte Folgendes.

Johannes

Und das, was eine View-Funktion erzeugt,

Johannes

ist dann eine Response und das ist genau der

Johannes

Abschluss dieses, sobald die View-Funktion fertig ist,

Johannes

ist die Verbindung weg.

Johannes

Um da

Johannes

weiterzugehen, um da WebSockets machen zu können,

Johannes

braucht man eben was anderes und das war früher Channels

Johannes

und jetzt wandert das so langsam in Django

Jochen

selbst rein. Wobei, also

Jochen

das soll wohl nie tatsächlich nach Django reinkommen,

Jochen

sondern Channels wird jetzt halt

Jochen

das Ding zum Handeln von anderen

Jochen

Protokollen, die nicht HTTP sind.

Jochen

also, und zwar nicht nur

Johannes

Das ist dann halt nicht, ja, das ist dann halt Django Channels,

Johannes

sondern, also es ist quasi

Johannes

Teil des

Jochen

Django Channels macht halt sowas dann wie WebSockets,

Jochen

aber halt nicht nur das, sondern halt auch WebRTC

Jochen

und halt auch MQTT und so.

Jochen

Ja, okay.

Jochen

Also alles, was eben lange Verbindungen braucht.

Jochen

Genau, genau. Aber du kannst es dann halt

Jochen

schon auch an Django damit anbinden,

Jochen

in gewisser Weise.

Jochen

Genau. Und es wird halt natürlich in

Jochen

Channels deutlich einfacher, weil wenn die Infrastruktur

Jochen

für ASGI halt schon in

Jochen

Django drin ist,

Jochen

dann, genau, brauchst du da nicht nochmal einen

Jochen

extra anderen Server oder so, dann kannst du einfach

Jochen

deine ganz normale Django-Infrastruktur weiterverwenden.

Jochen

Ja.

Jochen

Ja, ja, genau, genau.

Johannes

Okay, also das ist das halt, was ich da als Anwendungsfall sehe,

Johannes

dass man da leichter sozusagen in diese Welt reinkommt.

Jochen

Ja, also was ich total interessant finde,

Jochen

also wie gesagt nochmal, also wenn ihr das nicht kennt,

Jochen

Phoenix Elixier, würde ich mir ein Live-View angucken.

Jochen

Ja, das ist super spannend.

Jochen

Ja, was das Ding nämlich macht, ist, also man kennt das ja so,

Jochen

also ich würde sagen, das, was halt jetzt die meisten Leute schon kennen,

Jochen

Single-Page-App mit JavaScript, da funktioniert das halt so,

Jochen

du machst halt irgendwie auch immer GraphQL oder REST

Jochen

oder sonst was abfragen irgendwie

Jochen

gegen ein Backend.

Jochen

Und

Jochen

da gibt es auch teilweise sowas wie WebSockets oder so,

Jochen

aber im Grunde das ganze State Handling

Jochen

deiner Applikation

Jochen

machst du halt im Client.

Jochen

Beliebig, eklig

Jochen

oder halt auch gut, keine Ahnung.

Jochen

Redux war eine Zeit lang in, ist jetzt nicht mehr so.

Jochen

Jetzt gibt es halt andere.

Jochen

Vuex.

Jochen

Ja, und

Jochen

aber im Grunde, du machst das halt

Jochen

in der Applikation,

Jochen

weil du dann halt auch

Jochen

da das ganze

Jochen

DOM-Diffing machen kannst und

Jochen

dann halt nur die Sachen updaten, die wirklich geändert

Jochen

werden müssen und

Jochen

so. Und damit das alles funktioniert,

Jochen

musst du das halt dann im Client machen und so.

Jochen

Und

Jochen

Phoenix macht das halt anders.

Jochen

Das macht das alles auf dem Server.

Jochen

Und das schickt sozusagen nicht

Jochen

irgendwie

Jochen

jetzt gedifft irgendwie den DOM zurück,

Jochen

sondern es schickt dir halt sozusagen die Änderung

Jochen

an deinem State

Jochen

zurück an den

Jochen

Client und da wird es halt direkt im DOM

Jochen

geändert. Aber dadurch, dass das halt

Jochen

sozusagen auf dem Server alles ausgerechnet wird, kann das sehr blöd

Jochen

sein auf dem Client. Also da ist halt

Jochen

irgendwie der JavaScript-Teil

Jochen

von diesem

Jochen

Live-View-Dings ist halt irgendwie so in so tausend Zeilen

Jochen

und ich habe einen Vortrag irgendwie

Jochen

von dem Entwickler davon gesehen, der meinte immer so,

Jochen

also er muss immer aufpassen,

Jochen

er hatte manchmal das Gefühl, er ist jetzt hauptsächlich JavaScript-Entwickler

Jochen

und da muss er sich immer selber sagen,

Jochen

nein,

Jochen

Ich fand diese JavaScript-Frameworks

Jochen

alle immer ganz furchtbar und

Jochen

ich wollte das anders machen und

Jochen

ich sollte nicht jetzt anfangen

Jochen

irgendwie das nächste verrückte

Jochen

JavaScript-Font endzuschreiben, sondern das muss

Jochen

so wenig JavaScript bleiben wie möglich

Jochen

und es ist halt auch relativ wenig, es sind halt irgendwie

Jochen

tausend Zeilen oder so und

Jochen

alles andere passiert auf dem Server

Jochen

und das updatet

Jochen

den DOM direkt.

Jochen

Also was über die Leitung geht, ist tatsächlich nur

Jochen

so etwas wie

Jochen

Name des

Jochen

Attributs von irgendeinem Formularfeld

Jochen

oder sowas, dann neuer Wert und dann

Jochen

wird es halt geändert und zwar direkt im DOM.

Jochen

Und das ist halt natürlich nochmal

Jochen

deutlich schneller, als man das normalerweise

Jochen

so gewöhnt ist von den

Jochen

JavaScript-Frameworks und

Jochen

es ist halt weniger Kram auf der Leitung.

Jochen

Was man normalerweise, was man selbst bei

Jochen

diesen Single-Page-Apps-Geschichten halt

Jochen

auf der Leitung hat, ist ja nicht nur

Jochen

der Payload, der übertragen wird

Jochen

von den APs

Jochen

sozusagen, also weiß ich nicht, irgendwelches JSON,

Jochen

wo halt auch ganz

Jochen

viel immer dupliziert wird und

Jochen

ganz viel Boilerplate dabei ist, sondern

Jochen

was halt auch da immer noch mitkommt,

Jochen

ist halt diese ganze Protokollgeschichte und

Jochen

die Cookies, ja, so 4 Kilobyte-Cookie-Kram,

Jochen

der da hin und her geschickt wird,

Jochen

dann, und

Jochen

es wird jedes Mal nochmal, auch

Jochen

der Server muss immer nochmal, ach so,

Jochen

ach, hier ist deine Signatur, ach, du bist der

Jochen

User, ach, sehr gut, und, ja, alles klar,

Jochen

ich merke mir das mal und vergesse es sofort wieder

Jochen

beim nächsten Request, ja, das ist halt eigentlich,

Jochen

wenn man sich anguckt, was da tatsächlich passiert auf der

Jochen

Leitung, es ist alles ganz schön verrückt,

Jochen

Und wenn man sich dem gegenüber anguckt,

Jochen

was Elixir da macht, da geht einfach nur

Jochen

die rohen Daten, die gebraucht werden,

Jochen

um den DOM zu ändern, gehen über die Leitung

Jochen

und sonst nix. Und das ist wirklich

Jochen

super wenig.

Jochen

Das klingt ziemlich schlau. Und der Witz ist,

Jochen

genau das Gleiche könnte man mit Django

Jochen

eigentlich auch machen.

Jochen

Du brauchst eigentlich auch nur diese tausend Zeilen.

Jochen

Ja, ich dachte auch schon,

Jochen

ich dachte so,

Jochen

vielleicht sollte man sich diese tausend Zeilen

Jochen

JavaScript da mal genau angucken

Jochen

und dann halt das Ganze mit Channels

Jochen

oder weiß ich nicht, und WebSockets machen,

Jochen

weil das man in den States

Jochen

mit Async und so super handeln kann.

Jochen

Das kann man in Python

Jochen

und mit Django ganz genauso machen.

Jochen

Da braucht man das Erlangen da gar nicht.

Jochen

Ja, also genau.

Jochen

Das ist halt so ein bisschen das Versprechen.

Jochen

Und das wäre natürlich schon sehr cool,

Jochen

wenn man sowas machen könnte.

Jochen

Ja.

Jochen

Genau.

Jochen

Wir müssen noch ein paar Schlüsselwörter sagen.

Jochen

bevor wir aufhören können.

Jochen

Was ist denn ein Bier?

Jochen

Soll ich mal einfach so Wörter haben?

Jochen

Kooperatives Multitasking.

Jochen

Ach ja, kooperatives Multitasking.

Jochen

Genau, ja, wir haben jetzt noch gar nicht die wirklichen Unterschiede. Also, genau, es gibt jetzt unterschiedliche Ansätze, wie man diese Concurrency-Geschichte hinbekommt. Ah, soll ich ein bisschen was über Geschichte erzählen? Interessiert euch das?

Jochen

Im 19. Jahrhundert, oder?

Jochen

Also, damals. Also, wie Concurrency irgendwie nach Python gekommen ist. Ich weiß nicht, ich habe das, einen Großteil davon habe ich aus der…

Johannes

Das hört sich an wie so ein Märchen, was man seinen Kindern erzählt. Wie Concurrency damals nach Python gekommen ist.

Johannes

Ich kann nur diese Serie

Johannes

von Lukas Langer

Jochen

empfehlen, da habe ich jetzt einen Teil von dem,

Jochen

was ich jetzt erzähle.

Jochen

Und zwar ist es so Mitte der

Jochen

90er oder so, gab es da halt so erste

Jochen

Anwendungen für, man will

Jochen

vielleicht diverse Dinge parallel machen.

Jochen

Ach verdammt, jetzt bin ich selber in die Falle getroffen.

Jochen

Concurrent machen.

Jochen

Nebenläufig? Nebenläufig, ja.

Jochen

Und zwar,

Jochen

da gab es das Medusa-Framework

Jochen

für und das wurde

Jochen

zum Beispiel verwendet von Google.

Jochen

dann, um den Webcrawler zu

Jochen

bauen. Und so

Jochen

ist halt Python ja auch irgendwie bei Google

Jochen

reingekommen, halt über den Crawler.

Jochen

Und das ist

Jochen

auch irgendwann dann in die Standardbibliothek reingekommen

Jochen

als AsyncCore. Ich glaube, das

Jochen

Modul ist auch heute noch in der Standardbibliothek, aber

Jochen

ja, deprecated.

Jochen

Und

Jochen

dann gab es halt

Jochen

eine ganze Zeit lang

Jochen

irgendwie so Ansätze, dann kam

Jochen

irgendwie, glaube ich, zur Jahrtausendwende irgendwie so um den Dreh

Jochen

irgendwie Twisted dazu.

Jochen

wurde dann auch viel verwendet,

Jochen

war aber immer inkompatibel

Jochen

zum Rest von

Jochen

Python. So die normalen Standard

Jochen

Bibliothek-Funktionen, die blockieren

Jochen

alle, die machen alle synchronen I.O. und so.

Jochen

Das hat nie so richtig dazu gepasst. Das heißt,

Jochen

es musste alles irgendwie anders gemacht werden. Das heißt, man konnte

Jochen

Code, den man jetzt in Twisted,

Jochen

wo man Twisted benutzt hatte, um das

Jochen

Concurrent zu machen, nicht

Jochen

jetzt mit irgendwas anderem verwenden, wenn man

Jochen

jetzt vorhatte, auf G-Event umzusteigen oder so

Jochen

ging das halt nicht.

Jochen

Ja, und

Jochen

aber das, aber Twisted ist auch ein riesen

Jochen

Ding. Es gibt ganz viele Firmen, die das

Jochen

für irgendwelche Netzwerkgeschichten benutzt haben.

Jochen

In Apple hat das ganz...

Johannes

Super viele Sachen, die man vorher einfach nicht machen konnte.

Jochen

Genau, genau. Also war, ist schon ein

Jochen

riesen Ding.

Jochen

Der Mensch, der das entwickelt hat,

Jochen

Levkovits,

Jochen

glaube ich, der hat auch

Jochen

den Pep zu Async.io mitgeschrieben.

Jochen

Später, also

Jochen

Async.io ist dann auch sehr stark beeinflusst

Jochen

von Twisted.

Jochen

Ein anderer starker Einfluss

Jochen

ist Tornado.

Jochen

Auch einer aus dem

Jochen

Tornado-Projekt hat halt auch, ist einer

Jochen

von den drei Leuten, die halt den

Jochen

Async.io-Pep mitgeschrieben haben. Der andere ist

Jochen

dann Guido.

Jochen

Also Tornado und Twisted

Jochen

haben das beide stark beeinflusst.

Jochen

Tornado, auch eine ganz interessante Geschichte.

Jochen

Ist auch ein Ding,

Jochen

was Leute geschrieben

Jochen

haben. Ich glaube, ursprünglich hat das mal

Jochen

Brad Taylor geschrieben. Brad Taylor war bei Google

Jochen

Der hat irgendwie Gmail gemacht

Jochen

und Google Maps.

Jochen

Und dann haben ein paar von den Leuten, auch Paul Buchheit

Jochen

war, glaube ich, auch dabei, die haben dann

Jochen

eine neue Firma gemacht, irgendwann so 2007 oder so,

Jochen

Friendfeed. Ich weiß nicht, ob ihr euch

Jochen

daran erinnert.

Jochen

Ich habe es auch mal gehört. Ich weiß nicht, ob ich es mal benutzt habe.

Jochen

Keine Ahnung. Ist dann von Facebook

Jochen

gekauft worden.

Jochen

2009.

Jochen

Und

Jochen

ja, Brad Taylor

Jochen

ist dann CTO von Facebook geworden.

Jochen

Und ich hätte ja

Jochen

Das letzte zufällig war auch, glaube ich, in einer Podcast-Version mit Lukas Langer.

Jochen

Der war ja lange bei Facebook und erzählte dann so,

Jochen

dass intern bei Facebook ein großer Teil von Facebook ist halt irgendwie Python.

Jochen

Fand ich überraschend, wusste ich gar nicht.

Jochen

Und so komisch, wie kam denn da Python rein?

Jochen

Ja gut, vielleicht über Instagram oder so, aber nee, tatsächlich irgendwie,

Jochen

ja, der Autor von Tornado war halt CTO von Facebook lange Zeit.

Jochen

Also ja, und hat da wahrscheinlich auch irgendwie seine Python-Vorlieben

Jochen

vielleicht so ein bisschen ausgelebt.

Jochen

Jedenfalls, genau.

Jochen

Jeder bringt seine eigene Technologie mit.

Jochen

Ja, genau.

Jochen

Und ja, das Tornado ist auch heute noch irgendwie eine ganz interessante Geschichte.

Jochen

Wird auch noch nach wie vor aktiv entwickelt.

Jochen

Ist auch bei diesen Jupiter-Geschichten liegt das irgendwie drunter.

Jochen

Ja, und genau.

Jochen

Aber das waren halt alles Dinge, die unabhängig voneinander halt existiert haben.

Jochen

Und mit Python 2 war das sowieso alles nicht so gut kombinierbar.

Jochen

Und dann, genau, ist halt 2012, glaube ich, gab es dann so erste Ansätze dazu,

Jochen

das mal dann tatsächlich in die Standardbibliothek und in die Sprache irgendwie reinzubringen.

Jochen

Und ich glaube mit 3.4, das muss dann irgendwann so 2013 gewesen sein,

Jochen

ich weiß es nicht so genau, ist dann halt auch sozusagen das in der Sprache gelandet,

Jochen

beziehungsweise in der Standardbibliothek

Jochen

mit diesen Dekoratoren für Async-Funktionen.

Jochen

Und dann in 3.5 kam die echte Sprachunterstützung

Jochen

mit Async-Dev und Await dazu.

Jochen

Also ab dann gibt es eigentlich tatsächlich

Jochen

richtig Unterstützung in der Syntax.

Jochen

Ja, und es gab noch ein paar weitere Geschichten,

Jochen

die dann auch später dazugekommen sind.

Jochen

Da hat sich auch noch einiges getan.

Jochen

Es ist heute viel angenehmer,

Jochen

das Ganze zu benutzen,

Jochen

also es ist viel angenehmer, das zu benutzen als früher.

Jochen

Und es ist

Jochen

eigentlich inzwischen richtig klasse.

Jochen

Es ist aber

Jochen

eine völlig andere

Jochen

Geschichte als jetzt.

Jochen

Es gibt jetzt auch andere Sachen, also man kann zum Beispiel

Jochen

Multistriding

Jochen

gab es in Python auch schon immer,

Jochen

war in Python 2 ganz, ganz schrecklich,

Jochen

weil

Jochen

Noch schrecklicher?

Jochen

Ja,

Jochen

weil es tatsächlich so ein Lock-on-Tension

Jochen

Problemen gab. Also einmal ist es natürlich langsamer,

Jochen

als wenn es nur in einem Thread ist. Also je mehr Threads

Jochen

man hat, desto langsamer wird es eigentlich.

Jochen

Und Python 2 ganz besonders schrecklich auf mehreren

Jochen

Prozessoren, weil da haben

Jochen

die Threads sich dann tatsächlich um den Gil gekloppt.

Jochen

Und ja, das Ganze wurde noch

Jochen

viel schlimmer, langsamer. Aber auch

Jochen

da seit Python 3.2 gibt es einen neuen

Jochen

Jill. Also

Jochen

in Python 2 wurde das so gemacht,

Jochen

oder beziehungsweise vor Python 3.2,

Jochen

dass

Jochen

der Interpreter

Jochen

alle 100 Ticks, also

Jochen

Also ein Tick ist halt irgendwie so eine, ja, ich weiß nicht.

Jochen

Das ist ein Opcode, oder, der ausgeführt wird.

Jochen

Genau, das ist sozusagen eine primitive Operation,

Jochen

aber das kann auch so was sein,

Jochen

also wenn man sagt so for i in range eine Million,

Jochen

dann ist das auch nur ein Tick.

Jochen

Das ist so ein bisschen schlecht,

Jochen

weil es kann halt sein, dass ein Tick sehr, sehr lange dauert.

Jochen

Aber das Ding hat halt fix alle, nach 100 Ticks irgendwie geguckt,

Jochen

okay, hat so eine Check-Funktion aufgerufen

Jochen

und die hat dann einmal Signal-Handling gemacht.

Jochen

Aber auch geguckt, okay, welcher Thread läuft denn gerade?

Jochen

Muss ich da irgendwas, muss ich vielleicht einen anderen Thread

Jochen

in die Warteschlange der Threads, die jetzt runnable sind,

Jochen

fürs Betriebssystem reintun oder nicht?

Jochen

Das ist auch so, dass Python-Threads

Jochen

sind echte Betriebssystem-Threads.

Jochen

Also was ich dann oft lese,

Jochen

irgendwie ist sowas wie, ja, der Python-Interpreter

Jochen

schedulet da irgendwas.

Jochen

Nee, macht er nicht, das macht das Betriebssystem.

Jochen

Aber der Python-Interpreter kann natürlich sagen,

Jochen

okay, also dieser Thread hier wäre jetzt

Jochen

theoretisch runnable. Wer dann

Jochen

vom Betriebssystem

Jochen

tatsächlich sozusagen, wo der Kontext-Switch

Jochen

hingeht und welcher dann weiter ausgeführt wird,

Jochen

das macht das Betriebssystem dann.

Jochen

Ja, und... Und wie nennt man das,

Jochen

Jochen? Jetzt muss ich kurz das Schlüsselwort dazwischen

Jochen

sagen. Präemptives

Jochen

Multitasking. Genau, und das ist...

Jochen

Weil man zwischendurch abgebrochen werden kann. Präemptives

Jochen

Multitasking, weil man selber

Jochen

sozusagen, wenn man jetzt in einem Thread ist,

Jochen

kann man nicht bestimmen, wann einem

Jochen

die Kontrolle entzogen wird oder weil man...

Jochen

Und es kann jederzeit passieren.

Jochen

Auch in,

Jochen

ich habe mich da mal mit jemandem

Jochen

darüber gestritten und musste dann leider

Jochen

mir zeigen lassen,

Jochen

dass ich da Unrecht hatte. Das kann auch

Jochen

innerhalb eines Python-Befehls sein.

Johannes

Also Python-Befehle selbst sind dann

Johannes

nicht atomar, sondern es sind eben diese

Johannes

Bytecodes, die da drunter liegen, die atomar sind.

Johannes

Aber so eine

Johannes

Zuweisung wie i plus gleich

Johannes

1 ist auch nicht atomar,

Johannes

sondern das kann

Johannes

zwischendurch unterbrochen werden.

Johannes

Und das ist da die große

Johannes

Gefahr daran, dass man eben innerhalb

Johannes

eines Befehls, den man

Johannes

selbst als

Johannes

unteilbar sieht,

Jochen

kann man irgendwie die Kontrolle

Jochen

weggenommen kriegen, es passiert irgendwas anderes, jemand anders

Jochen

ändert irgendeinen Wert

Jochen

und man selber fängt wieder an

Jochen

und plötzlich sind die Sachen anders, als man erwartet hätte

Jochen

und es passieren schreckliche Dinge, ja.

Jochen

Also das ist präemptives Multitasking.

Jochen

Präemptives Multitasking, ja, genau.

Jochen

Hat natürlich gewisse Vorteile,

Jochen

aber es ist halt, also, ja, genau, aber erstmal, um das so zu, genau,

Jochen

dass es präventiv ist und das, was man aber heute hauptsächlich macht

Jochen

und was halt auch eine gewisse Geschichte, also auch schon immer eine Geschichte hatte,

Jochen

auch, es sind halt diese sozusagen Dinge, die man innerhalb von dem Thread

Jochen

oder innerhalb von dem Prozess ausführt, also wo das Betriebssystem gar nichts darüber weiß,

Jochen

dass man das macht, wo man das halt selber sozusagen, ja, entscheidet,

Jochen

dass man jetzt die Kontrolle abgibt oder

Jochen

was anderes macht. Und das ist dann halt

Jochen

kooperatives Multitasking. Und das ist halt

Jochen

so das, was man kennt aus,

Jochen

also in Java heißen die Dinger dann Green Threads

Jochen

oder das ist halt auch das, was in Stackless

Jochen

Python passiert ist oder das, was

Jochen

G-Event gemacht hat.

Jochen

Eventlets oder so. Ja, genau.

Jochen

Eventlets,

Jochen

LibEV liegt da glaube ich zum Beispiel

Jochen

unter Umständen drunter

Jochen

oder auch LibUV, also die

Jochen

Eventloop

Jochen

von Node.js.

Jochen

Das ist, LibIW hat, glaube ich, Armin Rigo geschrieben, was ja auch faszinierend war, die gleichen Namen, die man, also manchmal, da tauchten viele Namen auf, die ich schon kannte.

Jochen

Das sind erstaunlich wenige Leute.

Jochen

Ja, erstaunlich wenige Leute. Ich kannte die aus anderen Teilen schon und dachte so, ach, die haben auch diese ganzen Geschichten da, da haben die auch alle irgendwie mitgemacht, das wusste ich gar nicht.

Jochen

Also genau, Amin Rigo habe ich nur

Jochen

gehört im Zusammenhang mit PyPI,

Jochen

aber nie mit

Jochen

PyPI,

Jochen

aber nie mit

Jochen

irgendwie so

Jochen

Concurrency-Geschichten, aber ja,

Jochen

der hat, glaube ich, eine Bibliothek

Jochen

geschrieben, GreenLed,

Jochen

die auf LibEV basiert

Jochen

und darauf basiert wieder

Jochen

G-Event und G-Event

Jochen

macht halt quasi sozusagen

Jochen

User-Space-Threads

Jochen

und

Jochen

macht da aber auch

Jochen

teilt das irgendwie so halbwegs

Jochen

zufällig ein, wann die laufen und wann die nicht

Jochen

laufen und damit das

Jochen

halt mit dem Rest von der

Jochen

synchronen und blockierenden

Jochen

I.O.

Jochen

Funktion und so im Rest von Python

Jochen

funktioniert, monkeypatchen sie einfach alles.

Jochen

So zum Beispiel das Socket-Modul, ganz böse.

Jochen

Das ist aber auch hart. Das ist ziemlich hart.

Jochen

Okay, ja, das geht natürlich

Jochen

auch so.

Jochen

Das funktioniert.

Johannes

Wir gehen jetzt erstmal überall rein und

Jochen

Ja, also das ist schon bitter,

Jochen

aber

Jochen

zum Beispiel G-Event ist halt

Jochen

das, was auch unter G-Unicorn liegt.

Jochen

Deswegen heißt das Ding G-Unicorn.

Jochen

Deshalb heißt es G-Unicorn.

Jochen

Und genau.

Johannes

Gab es nicht früher mal was, das hieß Green-Unicorn

Johannes

und es ist dann so G-Unicorn geworden?

Johannes

Ja, genau.

Johannes

Und genau, das ist halt alles

Jochen

sozusagen kooperatives

Jochen

Multitasking im weitesten Sinne, wobei

Jochen

weiß ich jetzt gar nicht, bei G-Event bin ich mir jetzt gar nicht so super sicher.

Jochen

Ja, klar, bei G-Wand ist es auch kooperativ.

Jochen

Ja, im Prinzip ist es auch kooperativ.

Johannes

Aber jetzt, im Wesentlichen jetzt ist ja Ace & Geo oder so der...

Jochen

Genau, das ist jetzt sozusagen der heißeste Scheiß,

Jochen

sozusagen, den man jetzt da macht.

Jochen

Und ehrlich gesagt, also ich habe ja jetzt da jetzt auch

Jochen

eine ganze Zeit lang Sachen...

Jochen

Das sieht auch deutlich besser aus als alles,

Jochen

was man da so vorher gemacht hat.

Jochen

Ja, aber im Wesentlichen heißt es doch,

Jochen

jedes Mal, wenn du Yield sagst,

Johannes

wird dir die Kontrolle erst mal weggenommen.

Johannes

Yield?

Johannes

Ja, nicht Yield, Await.

Johannes

Ah, wenn du Await sagst, okay.

Johannes

Ja, früher war es Yield.

Jochen

Ja, yield from, genau, das war noch die

Jochen

so tags davor.

Johannes

Aber das ist so ein bisschen der zentrale Mechanismus,

Johannes

oder? Dass du sagst, okay, ich mache jetzt

Johannes

was und sobald ich await

Johannes

sage, kann jemand anders was machen.

Jochen

Genau, genau. Und das

Jochen

hat eine interessante Auswirkung auf die

Jochen

Art oder auf die Schwierigkeit, also wie schwer

Jochen

das zu programmieren ist, weil wenn du präventives

Jochen

Multitasking hast und an jeder Stelle kann im Grunde

Jochen

die Kontrolle weggehen,

Jochen

dann alle Dinge, die irgendwie

Jochen

atomar sein müssen, musst du halt dann mit

Jochen

Logs absichern.

Jochen

Mit so kritischen Sektionen musst du sie absichern.

Jochen

Und das Problem ist halt, du darfst halt nichts vergessen.

Jochen

Und das kann halt überall passieren.

Jochen

Ja, und selbst wenn du

Jochen

nichts vergessen hast, kommst

Jochen

du immer noch in so Deadlock-Situationen rein oder

Jochen

in so Starving-Situationen.

Jochen

Selbst wenn du alles richtig machst, kann es

Jochen

immer noch... Wenn es eine Starving-Situation

Dominik

ist, es wartet irgendjemand darauf, dass irgendwie

Dominik

wer losrennen kann, aber da kommt einfach

Johannes

nichts. Ne, das

Johannes

ist ein Deadlock. Deadlock heißt

Johannes

zwei oder mehr Dinge warten auf

Johannes

sich gegenseitig. Und ein

Johannes

Starving? Dann kann keiner loslaufen.

Johannes

Und Starving heißt, jemand,

Johannes

der etwas tun könnte, kommt nie dran.

Johannes

Weil immer jemand anders

Johannes

schon was tut. Das heißt,

Johannes

dass der nicht selber gelockt ist,

Johannes

sondern dass er einfach nicht

Johannes

zu niedrig ist.

Johannes

Oder weil er immer sagt,

Johannes

macht ihr erstmal. Dass der sozusagen für immer

Johannes

wartet, obwohl er etwas tun könnte.

Johannes

Obwohl er nicht irgendwo...

Dominik

Aber die können das ja alle schon so gut.

Dominik

Ich bleib da mal hier stehen.

Dominik

Genau, und sowas passiert dann halt.

Johannes

Sowas passiert halt in so präemptiven Sachen,

Johannes

weil du keine Kontrolle drüber hast, wer läuft.

Johannes

Beziehungsweise die Kontrolle, die jemand hat,

Johannes

ist eben das Betriebssystem.

Johannes

Und das muss dafür sorgen,

Johannes

dass so ein Deadlock entweder aufgelöst wird

Johannes

und dass solche Starving-Situationen nicht passieren.

Jochen

Ja, also es gibt halt diverse Techniken,

Jochen

mit denen man die Probleme minimieren kann.

Jochen

Es gibt dann so ein paar Patterns

Jochen

Und wahrscheinlich würde ich auch sagen, also für die meisten Fälle nimmt man halt so einen Pattern und dann kann eigentlich nicht mehr so wahnsinnig viel passieren. Man nimmt halt eine Queue oder halt viele Queues und macht da halt Logs rein und da gibt es auch schon fertige Dinge, wo man die Logs nicht selber setzen muss.

Johannes

Ja, aber auch da ist es erstaunlich leicht, in so Situationen reinzukommen, wo du dich deadlogst. Das ist erstaunlich leicht.

Jochen

Ja, ja, ich würde auch sagen, also es ist halt

Jochen

sehr scharfkantige Geschichte.

Jochen

Ja, man muss da echt aufpassen

Jochen

und genau, achso,

Jochen

richtig, genau,

Jochen

das habe ich eben nicht mehr erzählt, genau,

Jochen

nach 100 Ticks immer diese Geschichten, aber das hat halt

Jochen

diverse Nachteile, weil Tick kann halt sehr lange

Jochen

sein und dann gab es halt auch diese

Jochen

Battles über

Jochen

wer kriegt den Gill

Jochen

quasi auf unterschiedlichen Prozessoren und da so

Jochen

war halt, das war, wie

Jochen

David Beasley, gibt es halt

Jochen

Understanding the Jill zum Beispiel,

Jochen

den Vortrag von 2014

Jochen

oder Verhalten auf

Jochen

mehreren...

Jochen

Also er sagte irgendwie auf

Jochen

einer, also mit einem Stride, also alles gut, mit mehreren

Jochen

Strides, nicht so toll,

Jochen

auf mehreren Prozessoren, diabolical.

Jochen

Das war wirklich irgendwie nicht schön.

Jochen

Und

Jochen

ja, das ist aber mit Python 3.2

Jochen

besser geworden. Da gab es einen neuen

Jochen

Jill und der macht das nicht mehr nach

Jochen

Ticks, sondern es gibt jetzt einen Zeitintervall,

Jochen

was halt eben

Jochen

dazu führt, dass halt nicht

Jochen

quasi Dinge für immer

Jochen

warten müssen, weil halt

Jochen

ein Tick halt super lang war.

Jochen

Und zwar jetzt ist es halt so,

Jochen

jetzt ist es nicht alle 100 Ticks, sondern jetzt ist es alle

Jochen

5 Millisekunden. Man kann das aber auch einstellen, wie man

Jochen

möchte. Also das konnte man vorher auch schon.

Jochen

So alle 5 Millisekunden guckt halt der

Jochen

Interpreter nach.

Jochen

Muss mal jemand anders dran.

Jochen

Bitte?

Jochen

Muss mal jemand anders dran.

Jochen

Ja genau, kann mal jemand anders dran oder

Jochen

welches Schatz könnte laufen. Wobei letztlich, wer das

Jochen

entscheidet, ist das Betriebssystem.

Jochen

Ja, und das funktioniert jetzt deutlich

Jochen

besser. Das funktioniert auf mehreren CPUs auch

Jochen

gut. Ja, es ist nicht so, dass jetzt da auf mehreren CPUs

Jochen

gleichzeitig was gemacht würde, aber es ist nicht

Jochen

mehr so, dass die Performance viel schlechter ist, als wenn man

Jochen

nur einen CPU hätte, was ja schon mal

Jochen

auch nicht so schlecht ist. Genau.

Jochen

Daher, also Threading kann

Jochen

man auch verwenden. Also es ist auch nicht

Jochen

so, also es funktioniert mittlerweile alles ganz gut auf

Jochen

Linux. Also auch 10.000 Threads aufmachen,

Jochen

gar kein Problem, funktioniert.

Jochen

Ja, neulich hast du ausprobiert, Jochen.

Jochen

Bei 9.500 war Schluss bei mir.

Jochen

Aber

Jochen

also das geht alles und das ist auch nicht

Jochen

so, das findet man auch oft, ich war überrascht,

Jochen

ich habe da so ein bisschen recherchiert, wie

Jochen

oft da so Dinge auch in Büchern

Jochen

drinstehen, ich habe zum Beispiel Fluent Python mir angeguckt

Jochen

oder auch Effective Python von

Jochen

Brad Slatkin, also eigentlich beides sehr renommierte

Jochen

Quellen, weil ich dachte so, okay, so die

Jochen

Standardwerke, da muss es doch drinstehen, wie es geht und die sagen

Jochen

beide irgendwie, ah, Threads ganz schlecht,

Jochen

du kannst irgendwie keine,

Jochen

nicht so viele Threads aufmachen, weil

Jochen

der Stackspace

Jochen

im Betriebssystem riesig, brauchst

Jochen

halt 8 MB, zum Beispiel sagt

Jochen

Effective Python, bei Fluent Python

Jochen

sind es halt auch immer Größenordnungen von, jeder Thread

Jochen

braucht so Größenordnung MB, aber das ist halt nur

Jochen

Virtual Memory, das ist gar nicht

Jochen

Resident Memory, das heißt,

Jochen

das stimmt so nicht.

Jochen

Das ist viel weniger und das

Jochen

Context-Switchen, also es gibt da auch so einen schönen Artikel, wo

Jochen

jemand das alles mal gemessen hat und das ist,

Jochen

eigentlich sollte das alles kein Problem sein.

Jochen

Und vielleicht

Jochen

war das früher auch ein Problem, weil auf 32-Bit

Jochen

ist es tatsächlich blöd, weil der

Jochen

REST-Space nicht so groß ist, aber 64-Bit

Jochen

ja, sollte

Jochen

alles kein Ding sein.

Jochen

Und ja,

Jochen

Context-Switchen ist auch so schnell, das sollte auch kein Problem sein.

Jochen

Es könnte immer noch diese Log-Contention-Probleme

Jochen

geben, aber ich weiß nicht so genau.

Jochen

Naja,

Jochen

und, achso, was auch so ist,

Jochen

der Jail wird immer automatisch

Jochen

abgegeben, wenn irgendwie so

Jochen

Netzwerk-Blocking-Funktionen aufgerufen werden.

Jochen

Dann ist der auch sofort immer weg.

Jochen

Das heißt, das passiert,

Jochen

selbst wenn man Präfix-Multitasking hat,

Jochen

genau, passiert das automatisch.

Jochen

Also muss man sich auch nicht selber drum kümmern,

Jochen

sondern da gibt der Thread, der halt irgendeinen

Jochen

blockierenden Netzwerkaufruf gemacht hat oder I.O.-Aufruf,

Jochen

da ist der

Jochen

Drill sofort weg.

Jochen

Und ja,

Jochen

also ich würde

Jochen

sagen, mit Threads kann man eigentlich auch alle Sachen

Jochen

so, also wenn es darum geht, I.O. zu

Jochen

multiplexen, das kann man mit Threads auch wunderbar machen.

Jochen

Es ist schwerer zu programmieren,

Jochen

es ist halt ätzend, dass man nicht weiß,

Jochen

wann die Kontrolle weggenommen wird

Jochen

und so.

Jochen

Es ist im Debugging schwierig.

Jochen

Im Debugging ist es ziemlich übel, ja.

Jochen

Probleme, die wir vorhin

Jochen

erzählt haben. Da kommen dann halt irgendwelche Fehlermeldungen

Dominik

von irgendwo her. Irgendein Callback

Dominik

hat mal kurz gesagt, hallo, ich sterbe.

Dominik

Dann steht man halt da.

Jochen

Aber es geht auch. Und ich würde jetzt nicht

Jochen

sagen, das kann man gar nicht machen, sondern

Jochen

ja, es geht auch.

Jochen

Aber tatsächlich,

Jochen

Async.io würde ich auch sagen mittlerweile deutlich

Jochen

besser, weil das ist jetzt

Jochen

kooperativ. Da ist es so,

Jochen

es dreht sozusagen die Geschichte um.

Jochen

Bei Threads ist es so,

Jochen

man kann überall die Kontrolle weggenommen

Jochen

kriegen und Dinge sind bedroht, solange man

Jochen

nicht gesagt hat, okay, ich locke das jetzt hier.

Jochen

Ich benutze jetzt irgendeine Kerneldatenstruktur,

Jochen

um zu sagen, da bitte nicht.

Jochen

Dann ist das geschützt,

Jochen

aber alles andere ist halt irgendwie

Jochen

wilder Westen, Drachen

Jochen

kommen vorbei, verbrennen an die Hütte.

Jochen

Also ist halt, ja, weiß man nicht.

Jochen

Und bei Async.io ist es quasi umgekehrt.

Jochen

Da gibt es halt

Jochen

die Stellen, an denen böse Dinge passieren können,

Jochen

die sieht man, die sind markiert.

Jochen

Da steht Await vor.

Jochen

Und alle anderen Sachen, der ganze andere Code,

Jochen

das ist einfach ganz normaler Code,

Jochen

der so durchläuft, wo man sich sicher sein kann,

Jochen

dass einem die Kontrolle da nicht weggenommen wird

Jochen

und da kann man auch

Jochen

Operationen machen und wenn da nur, wenn da

Jochen

kein Await kommt, dann ist das alles atomar, weil

Jochen

kann sonst ja gar nichts passieren.

Jochen

Und das ist natürlich schön, weil

Jochen

die Anzahl

Jochen

möglicher Fehlerquellen wird halt deutlich

Jochen

geringer, aber man

Jochen

bezahlt natürlich in gewisser Weise einen Preis dafür

Jochen

und der ist halt, naja, also man muss sich halt

Jochen

auch selber drum kümmern, dass das halt,

Jochen

dass man die Kontrolle abgibt,

Jochen

wenn es geht, weil man alle anderen blockiert,

Jochen

wenn man das nicht tut.

Jochen

Man muss einfach kooperativ sein.

Jochen

Man muss kooperativ sein.

Jochen

Wenn man irgendwas macht, was nicht lange dauert,

Jochen

dann gehen halt alle anderen kaputt,

Jochen

was halt auch unter Umständen natürlich

Jochen

sehr große Konsequenzen haben kann.

Jochen

Aber da sieht man dann wenigstens.

Jochen

Also ich meine, wenn du da dann den Interpreter unterbrichst,

Johannes

siehst du, wo du bist.

Johannes

Du siehst, wer schuld ist.

Jochen

Genau. Es ist auch so, dass man kann,

Jochen

ich glaube, Python-X,

Jochen

wenn man Debug anschaltet

Jochen

und Trace Malloc

Jochen

anschaltet. Das sollte man immer machen, wenn man

Jochen

irgendwie so Async-IO-Sachen zumindest

Jochen

auf der Entwicklungsseite macht, dann

Jochen

sollte man das immer anschalten.

Jochen

Produktion natürlich unter Umständen nicht,

Jochen

kostet auch Ressourcen, aber dann

Jochen

sagt einem der Interpreter zum Beispiel so was wie

Jochen

also hier hast du irgendwie

Jochen

ein Task oder diese Funktionen, hockt

Jochen

die CPU und zwar ganz übel, weil er das

Jochen

intern halt aufruft mit einem

Jochen

Timeout und das halt mitkriegt und dann

Jochen

die Exception fängt, wenn

Jochen

das halt zu lange dauert. Dann sagt er halt so, also

Jochen

diese Funktion da, die macht irgendwas Böses.

Jochen

Das sieht man dann tatsächlich in der Ausgabe

Jochen

oder sagt einem auch, wenn man Sachen nicht

Jochen

awaited hat und so. Type Annotation

Jochen

ist auch total sinnvoll, vielleicht

Jochen

bei so hakeligen Geschichten. Da kann

Jochen

einem der Interpreter auch noch eine Menge sagen,

Jochen

was da halt dann schief geht.

Jochen

Weil er halt weiß, dass da jetzt eigentlich eine

Jochen

Kurroutine zurückkommen sollte und so. Und wenn das halt

Jochen

nicht passiert und dann, ja.

Jochen

Also da geht

Jochen

einiges.

Jochen

Und es ist halt, wie gesagt, also die

Jochen

bösen Stellen sind die, wo await davor steht und alles

Jochen

andere ist halt sozusagen ein ganz normaler

Jochen

Python-Code eigentlich.

Jochen

Und das ist halt schon

Jochen

schön. Und von den Ressourcengeschichten

Jochen

würde ich jetzt zwar sagen,

Jochen

nachdem ich mich so ein bisschen damit beschäftigt habe,

Jochen

es ist nicht so,

Jochen

ich weiß, es geht mit Swatch auch,

Jochen

aber natürlich ist es auch so, dass

Jochen

die sind schon ressourcenaufwendiger.

Jochen

Also das habe ich

Jochen

jetzt nicht nachvollzogen, aber Koroutine

Jochen

ist halt eigentlich nur ein Funktionsaufruf und

Jochen

braucht halt einen Kilobyte

Jochen

Hauptspeicher oder so und davon halt ganz, ganz viel zu haben.

Jochen

ist im Grunde überhaupt kein Problem. Du kannst

Jochen

10 Hunderttausende davon haben,

Jochen

kein Ding.

Jochen

Du musst halt bloß schnell genug bleiben, dass du halt

Jochen

tatsächlich, dass diese Hunderttausend Sachen auch irgendwann

Jochen

alle mal wieder drankommen, aber ansonsten

Jochen

geht das. Und

Jochen

ja, da gibt es ja dann auch sehr schnelle Event-Gloops

Jochen

drunter, also man kann halt auch, es gibt

Jochen

die Referenz-Implementation der

Jochen

Event-Gloob in Python,

Jochen

die ist nicht schnell, aber die ist halt dafür da,

Jochen

damit man weiß, wie es funktioniert.

Jochen

Auch wenn man jetzt eine andere Implementation

Jochen

schreibt, die auch dagegen testen kann, um zu gucken, verhält die sich

Jochen

jetzt genauso, wie sie sollte und so.

Jochen

Für Produktionen

Jochen

kann man dann halt sowas nehmen wie

Jochen

diese UV-Loop,

Jochen

oder LeapUV, und das ist

Jochen

die Node.js Event-Loop und die ist halt echt sackschnell.

Jochen

Also, ja, und

Jochen

damit kriegt man halt unter Python quasi da auch

Jochen

dann die gleiche Geschwindigkeit hin.

Jochen

Ja.

Jochen

Haben wir erklärt, was eine Event-Loop ist?

Jochen

Nein.

Jochen

Ich hätte jetzt mal einen Vorschlag.

Jochen

Ich würde jetzt auch so langsam mal die Kontrolle abgeben.

Jochen

Ja, ja, ja.

Jochen

und Sleep aufrufen.

Jochen

Einmal Await machen.

Jochen

Yield.

Johannes

Ich würde einmal Yield sagen und dann direkt Sleep aufrufen.

Johannes

Ja, ja, ja.

Johannes

Das ist doch ein sehr schönes Stichwort, oder?

Johannes

Ja.

Johannes

Aber es hört sich für mich so an,

Johannes

als ob wir noch mindestens zwei, drei Episoden

Johannes

daraus machen müssen.

Johannes

Vielleicht machen wir einfach noch eine.

Johannes

Alle Worte gesagt haben, die gesagt werden müssen.

Johannes

Also mir fallen noch viele Worte ein.

Johannes

Ja, mir auch.

Johannes

Dir fallen sicherlich auch noch ganz viele Worte ein.

Johannes

Es ist auch, wenn ich mich so an diese Vorlesungen erinnere,

Johannes

die wir da gemacht haben,

Johannes

Und es hat eine gewisse intellektuelle Schönheit, wenn man diese ganzen Locking-Algorithmen dann hat. Wenn man die Dining-Philosophers einmal besiegt hat oder wenn man einmal die Lockless-Data-Structures alle erfunden hat. Das hat auch was Schönes, aber es ist nicht was, was man jeden Tag in seiner Arbeit machen möchte, glaube ich.

Jochen

Nee, es ist wirklich schwer.

Jochen

Das ist auch eine massive Fehlerquelle.

Jochen

Ja, ja. Ich finde es auch

Jochen

wirklich, es ist

Jochen

hart. Also das ist schon so.

Dominik

Mein Fuß brennt immer noch von so einem völligen

Dominik

Vorfall.

Dominik

Ja.

Dominik

Ja, also es ist einfach

Johannes

sehr leicht, damit Fehler zu machen. Und ich glaube,

Johannes

dass das einer der großen Vorteile von

Johannes

diesen ganzen AsyncIO-Sachen jetzt ist.

Johannes

Wie du eben gesagt hast, der Code ist einfach

Johannes

linear. Und nur wenn ich

Johannes

Await sage, kann irgendwas Schlimmes passieren.

Johannes

Ich bin in der Verantwortung, dass ich Await sagen muss,

Johannes

damit ich kooperativ bin, damit die anderen auch mal

Johannes

können. Aber solange

Johannes

ich das nicht sage, passiert mir nichts.

Johannes

Und das nimmt ganz, ganz, ganz

Johannes

viele von diesen Ecken und Kanten

Johannes

daraus, die einem sonst eben

Johannes

ganz schlimm da reinfahren, die einem sonst die kritischen

Johannes

Sektionen kaputt machen.

Johannes

Und das

Johannes

ist eine sehr gute Entwicklung. Ich begrüße

Dominik

das sehr. Und das war ein sehr schönes Schlusswort,

Dominik

lieber Johannes.

Dominik

Alles klar, dann... Als ob ich es geplant hätte.

Dominik

Ja, würde ich sagen, machen wir doch einfach

Dominik

vielleicht dann. Ja, an dieser Stelle

Dominik

bleibt uns gewogen. Hört uns, wann immer

Dominik

ihr uns hört, lieber gerne immer weiter.

Dominik

Abends, morgens, mittags, nachts.

Dominik

An welchem Erdballteil ihr euch gerade

Dominik

befindet. Oder

Dominik

irgendwo out of space, man weiß es immer nicht genau.

Dominik

Also.

Dominik

Ja, schön, dass ihr wieder eingeschaltet

Dominik

habt. Alle Kritik, Feedback und so weiter.

Dominik

Hallo at peisenbockers.de. Bis zum

Dominik

nächsten Mal. Tschüss. Bis dann. Tschüss.