Hintergrundjobs¶
Mit den Hintergrundjobs kann man die Effizienz von Skriptausführungen optimieren.
Integrierte Hintergrundjobs mit Parameter AsJob
Get-Command -ParameterName AsJob # oder
Get-Help * -Parameter AsJob # findet auch in ungeladenen Modulen Cmdlets
Literatur: Weltner Kapitel 25 - Hintergrundjobs und Parallelverarbeitung
Übersicht über Cmdlets zum Thema Jobs:
Get-Command -Noun Job
Beispielhafte Skripts - hier erste Variante mit Aufrufen nacheinander:
# 3 Jobs nacheinander
# drei Aufgaben definieren
$code1 = { Start-Sleep -Seconds 5; "A" }
$code2 = { Start-Sleep -Seconds 6; "B" }
$code3 = { Start-Sleep -Seconds 7; "C" }
$start = Get-Date
& $code1
& $code2
& $code3
$end = Get-Date
$timespan = $end - $start
$seconds = $timespan.TotalSeconds
Write-Host "Gesamtdauer: $seconds sec."
Jetzt die Version mit Jobs:
$start = Get-Date
# drei Aufgaben definieren
$code1 = { Start-Sleep -Seconds 5; "A" }
$code2 = { Start-Sleep -Seconds 6; "B" }
$code3 = { Start-Sleep -Seconds 7; "C" }
# zwei Aufgaben in Hintergrundjobs verlagern und dort ausführen:
$job1 = Start-Job -ScriptBlock $code1
$job2 = Start-Job -ScriptBlock $code2
# die voraussichtlich längste Aufgabe in der eigenen PowerShell ausführen:
$result3 = & $code3
# warten, bis alle Hintergrundjobs ihre Aufgabe erledigt haben:
$alljobs = Wait-Job $job1, $job2
# Ergebnisse der Hintergrundjobs abfragen:
$result1 = Receive-Job $job1
$result2 = Receive-Job $job2
# Hintergrundjobs wieder entfernen
Remove-Job $alljobs
$end = Get-Date
# Ergebnisse ausgeben
$result1, $result2, $result3
$timespan = $end - $start
$seconds = $timespan.TotalSeconds
Write-Host "Gesamtdauer: $seconds sec."
In der Theorie: Zeit des längsten Skripte - hier 7sec bestimmt Gesamtlaufzeit!
In der Realität etwas länger, wegen Overhead - Kommunikation zwischen Hosts!
Anmerkungen:
Achtung: Hintergrundjobs, die viele Ergebnisse liefern, können Skriptabläufe sogar verlangsamen! Am Besten: nur Statusmeldung
Empfehlungen:
Langwierige Aufgaben - Overhead dann vernachlässigbar
Wenig Ergebnisse - diese müssten serialisiert werden für Austausch zwischen PSSessions
Kurze Lebensdauer - sonst muss man die PowerShell Session aufrechterhalten (Alternative: Task-Scheduling)