Database Reference
In-Depth Information
Eric sagt:
Nichtblockierender Code
Bevor wir mit diesem Buch begonnen haben, waren wir mit ereignisgesteuerten,
nichtsperrenden Anwendungen nur flüchtig vertraut. Nichtblockierend bedeutet ge-
nau das: Statt darauf zu warten, dass ein lange laufender Prozess zum Ende kommt,
wird der Hauptprozess weiter ausgeführt. Was auch immer als Reaktion auf ein blo-
ckierendes Ereignis nötig ist, packen Sie in eine Funktion oder einen Codeblock, der
später ausgeführt wird. Das kann das Starten eines separaten Threads bedeuten
oder (wie in unserem Fall) die Implementierung eines ereignisgesteuerten Reactor-
Musters.
Bei einem blockierende Programm können Sie Code entwickeln, der eine Datenbank
abfragt, wartet und dann die Ergebnisse verarbeitet.
results = database.some _ query()
for value in results
# Mach etwas mit jedem Wert
end
# Dieser Teil wird erst ausgeführt, wenn alle Ergebnisse verarbeitet wurden...
Bei einem ereignisgesteuerten Programm übergeben Sie diese Schleife als Funk-
tion/Codeblock. Während die Datenbank ihr Ding macht, läuft der Rest des Pro-
gramms weiter. Erst wenn die Datenbank die Ergebnisse zurückgibt, wird die Funk-
tion/der Codeblock ausgeführt.
database.some _ query do |results|
for value in results
# Mach etwas mit jedem Wert
end
end
# Dieser Teil wird schon ausgeführt, während die Datenbankabfrage läuft...
Es dauert seine Zeit, bis man die Vorteile erkennt. Ja, der Rest des Programms kann
weiterlaufen, statt untätig auf die Datenbank warten zu müssen, aber ist das üblich?
Anscheinend ja, denn als wir begannen, in diesem Stil zu entwickeln, bemerkten wir
eine Reduzierung der Latenz um eine ganze Größenordnung.
Wir versuchen, den Code so einfach wie möglich zu halten, doch die nichtblockie-
rende Arbeit mit einer Datenbank ist von Natur aus ein komplexer Prozess. Doch
wir haben gelernt, dass es beim Umgang mit Datenbanken generell eine sehr gu-
te Methode ist. Nahezu jede populäre Programmiersprache besitzt irgendeine Art
nichtblockierender Bibliothek. Ruby hat EventMachine, Python hat Twisted, Java
die NIO-Bibliothek, C# hat Interlace und JavaScript hat natürlich Node.js.
folgenden Code entsprechend. Redis muss nach wie vor laufen. Laden Sie
die folgende Datei herunter und führen Sie sie aus:
$ node populate _ couch.js
 
Search WWH ::




Custom Search