Programmiersprache: Julia 1.3 zielt auf Multithreading

Die Programmiersprache führt zunächst experimentell einen Ansatz für die parallele Ausführung von Aufgaben ein.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen
Programmiersprache. Julia 1.3 zielt auf Multithreading
Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Die Entwickler von Julia haben mit Version 1.3 das dritte Release der Programmiersprache in diesem Jahr herausgegeben. Die wesentliche Neuerung betrifft das Multithreading mit einem Scheduler, der das Verteilen von Aufgaben auf verfügbare Threads automatisiert. Darüber hinaus gibt es zahlreiche neue Methoden in den Bibliotheken und Julia verarbeitet Unicode 12.1.0.

Die Kernsprache kennt zudem neuerdings die Syntax var"#str#" für die Ausgabe und das Parsen von Variablennamen, die nicht dem Standardnamensschema entsprechen. Der zugehörige Issue auf GitHub nennt als Grund unter anderem, dass Entwickler auf die Weise Bezeichner von anderen Programmiersprachen wie R übernehmen können, die in Julia nicht erlaubt sind.

Die wohl interessanteste Neuerung hatte das Julia-Team bereits im Juli in einem umfangreichen Blogbeitrag angekündigt: Composable Multi-Threaded Parallelism beschreibt den Ansatz für die Parallelisierung in der Programmiersprache, der bisher noch als experimentell gekennzeichnet ist. Grundsätzlich steht das Thema jedoch bereits seit Jahren auf der To-do-Liste des Julia-Teams.

Version 1.3 führt nun das Makro @spawn ein, das eine Aufgabe für die parallele Ausführung kennzeichnet. Die eigentliche Verwaltung der Threads übernimmt ein dynamischer Scheduler, sodass Entwickler sich nicht darum kümmern müssen, wie viele Threads sie erstellen und wieder beenden. Der Blogbeitrag vergleicht das Vorgehen mit einem Garbage Collector.

Als einfaches Beispiel führt der Beitrag eine bewusst ineffiziente Berechnung einer Fibonacci-Folge auf, die das rekursive Berechnen über das @spawn-Makro in jeweils eigene Threads auslagert:

import Base.Threads.@spawn

function fib(n::Int)
if n < 2
return n
end
t = @spawn fib(n - 2)
return fib(n - 1) + fetch(t)
end

Das Multithreading ist insofern composable, als es sich beliebig zusammensetzen lässt: Funktionen im Programm können parallel ablaufen und dabei Library-Funktionen aufrufen, die ihrerseits auf Parallelität ausgelegt sind. Der Scheduler verhindert, dass die Software mehr Threads anfordert, als die CPU verarbeiten kann.

Als Randnotiz gilt zu bemerken, dass die Standardbibliothek Distributed ebenfalls ein @spawn-Makro enthält, das aber künftig wegfallen soll. Aus Kompatibilitätsgründen wird es in der 1.x-Reihe der Programmiersprache erhalten bleiben und gilt in Julia 1.3 als überholt (deprecated). Das neue Makro @spawnat :any expr ersetzt derweil bereits @spawn expr.

Im Zuge der Anpassungen für Multithreading sind zudem alle Ein- und Ausgabeoperationen in Julia Thread Safe angelegt. Dasselbe gilt für den globalen Zufallszahlengenerator GLOBAL_RNG.

Neben dem experimentellen Multithreading sind einige Library-Ergänzungen erwähnenswert. Die neue Methode findall(pattern, string) findet wahlweise eine Zeichenkette oder einen regulären Ausdruck innerhalb eines String, und Entwickler dürfen den Methoden findfirst, findlast, findnext und findprev einen Charakter als ersten Parameter übergeben, um im als zweiten Parameter übergebenen String danach zu suchen.

Die weiteren Neuerungen in den Bibliotheken lassen sich den Release Notes von Julia 1.3 entnehmen. Die Programmiersprache ist über die Download-Seite auf GitHub verfügbar. (rme)