Jobs und Multithreading

Posted on: 23. Oktober 2018
Um grössere Aufträge in kurzer Zeit abzuarbeiten greiffen wir auf Multithreading zurück. In PowerSHELL geht das mittels Jobs. Wir schauen anhand eines einfachen Beispiels wie du Jobs erstellst, abwartest und schlussendlich der Ergebnisse zurückholst.

Denk dran: solltest du Wünsche oder Anregungen für Themen und Beträge haben, dann lass es mich bitte wissen z.B. in einem Kommentar oder oben auf dem Input-Formular
Hier der Code aus dem Youtube-Video. Die Vorgehensweise und Bemerkungen findest du direkt als Kommentare (#Grün) im Code. So wird er dir ebenfalls in der PowerSHELL ISE angezeigt werden.
——————————————–
# PowerSHELL Jobs oder Multithreading            
            
# Beispielaufgabe ohne Jobs            
$Scriptblock = {return (Measure-Command -Expression {Get-Random (0..10000000)}).TotalSeconds}            
            
# Einmaliges ausführen des Scriptblocks            
&$Scriptblock            
            
# Anzahl Durchläufe            
$AnzJobs = 10            
            
# Startzeit der Jobs messen            
$Startzeit = Get-Date            
            
# Pro Durchlauf einen Job erstellen mittels FOR-Schleife            
Write-Host "Es werden nun $AnzJobs Jobs verarbeitet" -ForegroundColor Yellow            
for ($i = 0; $i -lt $AnzJobs; $i ++)            
    {            
            
        Start-Job -Name ("Random"+$i) -ScriptBlock $Scriptblock | Out-Null            
            
    }            
            
# Warten auf die Beendigung aller Jobs            
Write-Host "Warte auf die Jobs" -ForegroundColor Yellow            
Get-Job | Wait-Job            
            
# Abrufen aller Ergebnisse            
Write-Host "Abrufen der Ergebnisse" -ForegroundColor Cyan            
$JobErgebnisse = @()            
            
for ($i = 0; $i -lt $AnzJobs; $i ++)            
    {            
            
        $JobErgebnisse += Get-Job -Name ("Random"+$i) | Receive-Job            
                    
        # Nach Abrufen, den Job löschen            
        Get-Job -Name ("Random"+$i) | Remove-Job            
            
    }            
            
# Benötige Zeit der Jobs ausgeben            
cls            
            
$Endzeit = [math]::Round(((Get-Date) - $Startzeit).TotalSeconds,2)            
            
$Rechenzeit = [math]::Round(($JobErgebnisse | Measure-Object -Sum).sum,2)            
            
$Geschwindigkeit = [math]::Round(($Rechenzeit/$Endzeit)*100,2)            
            
Write-Host "Benötigte Zeit war $Endzeit Sekunden" -ForegroundColor Green            
Write-Host "Verarbeitete Rechenzeit ist $Rechenzeit Sekunden" -ForegroundColor Green            
Write-Host "Die Geschwindigkeit war $Geschwindigkeit %" -ForegroundColor Cyan
——————————————–
Solltest du irgendwelche Fragen haben, dann kannst du diese gerne entweder hier im Blog oder direkt unter dem YouTube Video stellen. Ich gebe alles, deine Fragen zeitnahe zu beantworten oder ein entsprechendes Video darüber zu machen.
Gerade die Grundlagen-Videos werde ich nicht mit viel Text ausschmücken. Bei mir ist jeweils jede Code-Zeile direkt im Code Kommentiert (#Grün). Du kannst den Code direkt mit in dein Script kopieren und hast so eine gute Orientierungshilfe, sobald du die Scripts auf deine Bedürfnisse anpasst.

Ich erstelle und veröffentliche sämtliche Videos kostenlos und blende auch keine Werbung ein, dies will ich auch so beibehalten. Da das vermittelte Wissen aber in teuren Kursen erlangt werden kann, ist eine kleine Spende hin und wieder sicher keine schlechte Gegenleistung.