© Excellent backgrounds/Shutterstock.com
Kolumne: Die Golumne

Nebeneinander


Go wurde vor etwas über 10 Jahren durch das Google-Team rund um Robert Griesemer, Rob Pike und Ken Thompson vorgestellt. Die Sprache wurde von der Entwicklergemeinde unterschiedlich aufgenommen. Für viele war es eine Art neues C, große Neuigkeiten waren nicht enthalten. Ein wenig aufgeräumter, eine Garbage Collection wie in Java, aber keine vollwertige Objektorientierung. Und dann war da noch diese Nebenläufigkeit. Wozu soll die gut sein, es gab ja das Multithreading, und mit Pools und Semaphoren hatte man es gut im Griff.

Doch damit wurde man dem Vorteil einer echten Concurrency nicht gerecht. Eine Auslastung der Kerne wie bei modernen Prozessoren ist bereits eine gute Motivation. Doch eigentlich kommt man so der Idee hinter der Objektorientierung näher als viele denken. Individuell arbeitende Komponenten werden zu einer gemeinsamen Lösung zusammengesetzt. Wie sagte Rob Pike so schön?

„Parallelism: Programming is the simultaneous execution of (possibly related) computations.

Concurrency: Programming is the composition of independently executing processes.“

In Go kommt dafür das Prinzip der Communicating Sequential Processes (CSP) in Form von Goroutinen und Channels zum Einsatz. Goroutinen sind Funktionen, die durch die Runtime auf einen Threadpool verteilt werden. Hier werden sie mit geringerem Overhead als Threads betrieben. Doch bei mehreren hundert oder tausend Goroutinen wäre bei der Nutzung von Shared Memory die Synchronisation ein sensibles Thema. Semaphoren, beziehungsweise Mutexe, können in Go dazu führen, dass man sich verheddert und so einen Deadlock oder Races erzeugt. Um das zu verhindern, sorgen Channels für ein sauberes Miteinander beim Senden und Empfangen von Daten. Und im Rahmen von Schleifen wird immer nur ein Datum zeitgleich verarbeitet. Doch wie werden diese Goroutinen genutzt? Was sind die gängigen Muster?

Die einfachste Form benötigt keine Channels. Es geht um Aufgaben, die ab einem gewissen Zeitpunkt alle Daten für ihre Arbeit brauchen: nicht nur die Eingabedaten, sondern oft alles, was für eine explizite Ausgabe benötigt wird. Schließlich sollen die verarbeiteten Daten irgendwo landen. Mögliche Ziele wären Dateien, Datenbanken oder eine Netzwerkverbindung, typisches I/O. Das findet sich z. B. im Server des Package net/http. Er wartet in einer Schleife auf seinem Socket auf eintreffende Verbindungen, erstellt hiermit ein Verbindungsobjekt, gibt ihm einen Context mit und schickt die Verarbeitung mit einem go c.serve(connCtx) in d...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang