Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Nebenläufige Programmierung / hyper und race 🆕
Feinjustieren mit :batch und :degree
Sowohl .hyper als auch .race nimmt zwei
Adverbien auf, die steuern, wie die Arbeit über Threads
verteilt wird: :degree und :batch. Sie
brauchen sie selten, aber zu ihnen greifen Sie, wenn Sie auf
Geschwindigkeit abstimmen.
:degree — wie viele
Arbeiter
:degree legt fest, wie viele Arbeits-Threads zugleich
laufen:
say (1..5).hyper(:degree(2)).map(*²); # (1 4 9 16 25)Standardmäßig liegt der Grad nahe an der Zahl der CPU-Kerne der
Maschine — auf einer Maschine mit acht Kernen ist er 7 und
lässt einen Kern für das Hauptprogramm. Ihn deutlich über die Kernzahl
zu heben hilft selten, denn es gibt keine weiteren Kerne, auf denen
gelaufen werden könnte, und die zusätzliche Koordination kann sogar
bremsen.
:batch — wie
viele Elemente auf einmal
:batch legt fest, wie viele Elemente jeder Arbeiter auf
einmal nimmt, bevor er um mehr zurückkommt:
say (1..6).hyper(:batch(2)).map(*²); # (1 4 9 16 25 36)Die Standardgröße ist 64, und die Größe ist eine
Abwägung:
- Eine große Portion bedeutet weniger Hin und Her zwischen Arbeitern und Ablaufsteuerung — weniger Aufwand, was gut ist, wenn jedes Element ungefähr gleich viel kostet.
- Eine kleine Portion verteilt die Arbeit gleichmäßiger, wenn manche Elemente weit teurer sind als andere, sodass kein einzelner Arbeiter mit allen langsamen sitzen bleibt — zum Preis von mehr Koordination.
Sie können beide zugleich setzen, bei .race genauso wie
bei .hyper:
say (1..6).race(:degree(2), :batch(3)).map(*²).sum; # 91Wenn Sie neugierig sind, wie die Standardwerte tatsächlich lauten, können Sie über Rakudos Innenleben nachsehen. Beachten Sie, dass dies ein privates Attribut liest — es ist keine feste Schnittstelle, und die Zahlen hängen von Ihrer Maschine ab:
my $h := (1..10).hyper;
say $h.^attributes.first(*.name.contains('config')).get_value($h).raku;
# HyperConfiguration.new(batch => 64, degree => 7)Hier ist batch der feste Standardwert 64,
während degree 7 ist — einer weniger als die
acht Kerne dieser Maschine.
Es bleiben nur Hinweise
Wie .hyper und .race selbst
bitten diese Adverbien um eine bestimmte Aufteilung,
statt sie zuzusichern. Ein Compiler darf sie beachten, anpassen oder
ganz übergehen — behandeln Sie :batch und
:degree also als Stellschrauben zum Ausprobieren, nicht als
Versprechen darüber, wie die Arbeit genau ablaufen wird.
Praxis
Lösen Sie 1 Quiz zum Inhalt dieses Themas.
Kursnavigation
← Ungeordnete Parallelität mit race | Quiz — batch und degree →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.