Channels in Go: Bequem parallel

Seite 5: Kein Schrecken bei der Parallelprogrammierung

Inhaltsverzeichnis

Wer sich hingegen fragt, warum das parallelisierte Programm nicht so schnell läuft wie erhofft, dem sei das Paket runtime/trace wärmstens empfohlen. Es erzeugt ähnlich wie der Profiler unter runtime/pprof eine Protokolldatei, die sich mit go tool trace _datei_ auswerten lässt. Das Kommando öffnet im Webbrowser eine Seite mit dem Link "View trace". Das folgende Bild zeigt, welche Informationen sich dahinter finden:

Das Paket runtime/trace erzeugt eine Protokolldatei, die Entwickler und Entwicklerinnen auswerten können.

(Bild: Dr. Reinhard Wobst)

Wann ist welche Funktion als Go-Routine gelaufen, welche System- und Funktionsrufe wurden dabei ausgeführt (braune Striche, hineinzoomen) und wann war denn der Garbage Collector (GC) überhaupt aktiv? So ist erkennbar, dass der GC teilweise parallel zu vielen Go-Routinen läuft. Das Tool ist noch in der Entwicklung und nicht vollständig dokumentiert, aber es liefert schnell eine Vorstellung davon, wie gut die Parallelisierung wirkte und wo es noch hakt.

Channels nehmen viel vom Schrecken der Parallelprogrammierung, denn mit ihnen können Entwickler und Entwicklerinnen nebenläufige Programme besser verstehen. Mutexe werden durch sie nicht überflüssig, sondern neben den atomaren Operationen aus sync/atomic auch in Go verwendet. Für die hier beschriebenen Fälle sind Channels jedoch einfach besser geeignet und erlauben größere Flexibilität ohne Verkomplizierung. Entwicklungszeit nebst Fehlersicherheit eines Programms sind nicht selten entscheidender als einige Prozente Performance mehr. Go ist als kompilierte Sprache trotz des Garbage Collector – der unzählige Fehler vermeiden hilft und die Programmierung extrem vereinfacht – schnell genug.

Channels sind nicht auf Go beschränkt. In Python gibt es das Modul Queue, das funktional mithalten kann, obgleich es ungleich ineffizienter und langsamer als Go-Channels ist. Dafür geht Python Queues sogar prozessübergreifend an (Modul Multiprocessing), die zudem echte Parallelisierung im Unterschied zum Multithreading erlauben. Python führt Threads nach wie vor nur auf einem Core aus. Auch Rust bietet Channels und in C++ lassen sie sich programmieren.

Dr. Reinhard Wobst
ist Mathematiker und arbeitet als selbstständiger Programmierer, Autor und Berater mit Spezialisierung auf die Gebiete Kryptologie und Unix/Python.

(fms)