Start-ThreadJob
Erstellt Hintergrundaufträge ähnlich dem Start-Job
Cmdlet.
Syntax
Start-ThreadJob
[-ScriptBlock] <ScriptBlock>
[-Name <String>]
[-InitializationScript <ScriptBlock>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-ThrottleLimit <Int32>]
[-StreamingHost <PSHost>]
[<CommonParameters>]
Start-ThreadJob
[-FilePath] <String>
[-Name <String>]
[-InitializationScript <ScriptBlock>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-ThrottleLimit <Int32>]
[-StreamingHost <PSHost>]
[<CommonParameters>]
Beschreibung
Start-ThreadJob
erstellt Hintergrundaufträge ähnlich dem Start-Job
Cmdlet. Der Standard Unterschied besteht darin, dass die erstellten Aufträge in separaten Threads innerhalb des lokalen Prozesses ausgeführt werden. Standardmäßig verwenden die Aufträge das aktuelle Arbeitsverzeichnis des Aufrufers, der den Auftrag gestartet hat.
Das Cmdlet unterstützt auch einen ThrottleLimit-Parameter , um die Anzahl der gleichzeitig ausgeführten Aufträge zu begrenzen. Wenn mehr Aufträge gestartet werden, werden sie in die Warteschlange eingereiht und warten, bis die aktuelle Anzahl von Aufträgen unter die Drosselungsgrenze fällt.
Beispiele
Beispiel 1: Create Von Hintergrundaufträgen mit einem Threadlimit von 2
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } } -ThrottleLimit 2
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 ThreadJob Running True PowerShell 1..100 | % { sleep 1;...
2 Job2 ThreadJob Running True PowerShell 1..100 | % { sleep 1;...
3 Job3 ThreadJob NotStarted False PowerShell 1..100 | % { sleep 1;...
Beispiel 2: Vergleichen der Leistung von Start-Job und Start-ThreadJob
Dieses Beispiel zeigt den Unterschied zwischen Start-Job
und Start-ThreadJob
. Die Aufträge führen das Start-Sleep
Cmdlet 1 Sekunde lang aus. Da die Aufträge parallel ausgeführt werden, beträgt die Gesamtausführungszeit ca. 1 Sekunde zuzüglich der zum Erstellen der Aufträge erforderlichen Zeit.
# start five background jobs each running 1 second
Measure-Command {1..5 | % {Start-Job {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds
Measure-Command {1..5 | % {Start-ThreadJob {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds
TotalSeconds
------------
5.7665849
1.5735008
Nach dem Subtrahieren von 1 Sekunde für die Ausführungszeit sehen Sie, dass Start-Job
etwa 4,8 Sekunden dauert, um fünf Aufträge zu erstellen. Start-ThreadJob
ist 8 mal schneller und benötigt etwa 0,6 Sekunden, um fünf Aufträge zu erstellen. Die Ergebnisse können in Ihrer Umgebung variieren, aber die relative Verbesserung sollte identisch sein.
Beispiel 3: Create Von Aufträgen mithilfe von InputObject
In diesem Beispiel verwendet der Skriptblock die $input
Variable, um Eingaben vom InputObject-Parameter zu empfangen. Dies kann auch erfolgen, indem Objekte an gepipet werden Start-ThreadJob
.
$j = Start-ThreadJob -InputObject (Get-Process pwsh) -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
94 145.80 159.02 18.31 18276 1 pwsh
101 163.30 222.05 29.00 35928 1 pwsh
$j = Get-Process pwsh | Start-ThreadJob -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
94 145.80 159.02 18.31 18276 1 pwsh
101 163.30 222.05 29.00 35928 1 pwsh
Beispiel 4: Stream Auftragsausgabe an den übergeordneten Host
Mithilfe des StreamingHost-Parameters können Sie einen Auftrag anweisen, alle Hostausgaben an einen bestimmten Host weiterzuleiten. Ohne diesen Parameter geht die Ausgabe an die Auftragsdatenstromsammlung und wird erst in einer Hostkonsole angezeigt, wenn Sie die Ausgabe des Auftrags erhalten haben.
In diesem Beispiel wird der aktuelle Host mithilfe der $Host
automatischen Variablen an übergebenStart-ThreadJob
.
PS> Start-ThreadJob -ScriptBlock { Read-Host 'Say hello'; Write-Warning 'Warning output' } -StreamingHost $Host
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
7 Job7 ThreadJob NotStarted False PowerShell Read-Host 'Say hello'; ...
PS> Say hello: Hello
WARNING: Warning output
PS> Receive-Job -Id 7
Hello
WARNING: Warning output
PS>
Beachten Sie, dass die Eingabeaufforderung von Read-Host
angezeigt wird und Sie eingaben können. Anschließend wird die Meldung von Write-Warning
angezeigt. Das Receive-Job
Cmdlet gibt die gesamte Ausgabe des Auftrags zurück.
Beispiel 5: Gleichzeitiges Herunterladen mehrerer Dateien
Das Invoke-WebRequest
Cmdlet kann jeweils nur eine Datei herunterladen. Im folgenden Beispiel wird verwendet Start-ThreadJob
, um mehrere Threadaufträge zu erstellen, um mehrere Dateien gleichzeitig herunterzuladen.
$baseUri = 'https://github.com/PowerShell/PowerShell/releases/download'
$files = @(
@{
Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.msi"
OutFile = 'PowerShell-7.3.0-preview.5-win-x64.msi'
},
@{
Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.zip"
OutFile = 'PowerShell-7.3.0-preview.5-win-x64.zip'
},
@{
Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.msi"
OutFile = 'PowerShell-7.2.5-win-x64.msi'
},
@{
Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.zip"
OutFile = 'PowerShell-7.2.5-win-x64.zip'
}
)
$jobs = @()
foreach ($file in $files) {
$jobs += Start-ThreadJob -Name $file.OutFile -ScriptBlock {
$params = $using:file
Invoke-WebRequest @params
}
}
Write-Host "Downloads started..."
Wait-Job -Job $jobs
foreach ($job in $jobs) {
Receive-Job -Job $job
}
Parameter
-ArgumentList
Gibt ein Array von Argumenten oder Parameterwerten für das Skript an, das durch die Parameter FilePath oder ScriptBlock angegeben wird.
ArgumentList muss der letzte Parameter in der Befehlszeile sein. Alle Werte, die dem Parameternamen folgen, sind interpretierte Werte in der Argumentliste.
Type: | Object[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-FilePath
Gibt eine Skriptdatei an, die als Hintergrundauftrag ausgeführt werden soll. Geben Sie den Pfad und dateinamen des Skripts ein. Das Skript muss sich auf dem lokalen Computer oder in einem Ordner befinden, auf den der lokale Computer zugreifen kann.
Wenn Sie diesen Parameter verwenden, konvertiert PowerShell den Inhalt der angegebenen Skriptdatei in einen Skriptblock und führt den Skriptblock als Hintergrundauftrag aus.
Type: | String |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InitializationScript
Gibt Befehle an, die vor dem Starten des Auftrags ausgeführt werden. Schließen Sie die Befehle in geschweifte Klammern ({}
) ein, um einen Skriptblock zu erstellen.
Verwenden Sie diesen Parameter zum Vorbereiten der Sitzung, in der der Auftrag ausgeführt wird. Sie können sie beispielsweise verwenden, um der Sitzung Funktionen und Module hinzuzufügen.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InputObject
Gibt die Objekte an, die als Eingabe für den Skriptblock verwendet werden. Es ermöglicht auch die Pipelineeingabe. Verwenden Sie die $input
automatische Variable im Skriptblock, um auf die Eingabeobjekte zuzugreifen.
Type: | PSObject |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Name
Gibt einen Anzeigenamen für den neuen Auftrag an. Sie können den Namen verwenden, um den Auftrag für andere Auftrags-Cmdlets zu identifizieren, z. B. das Stop-Job
Cmdlet.
Der Standardmäßige Anzeigename ist "Job#", wobei "#" eine Ordnungszahl ist, die für jeden Auftrag erhöht wird.
Type: | String |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ScriptBlock
Gibt die im Hintergrundauftrag auszuführenden Befehle an. Schließen Sie die Befehle in geschweifte Klammern ({}
) ein, um einen Skriptblock zu erstellen. Verwenden Sie die $Input
automatische Variable, um auf den Wert des InputObject-Parameters zuzugreifen. Dieser Parameter ist erforderlich.
Type: | ScriptBlock |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-StreamingHost
Dieser Parameter bietet eine threadsichere Möglichkeit, die Ausgabe direkt an das übergebene PSHost-Objekt zu ermöglichenWrite-Host
. Ohne sie Write-Host
geht die Ausgabe an die Datenstromsammlung für Auftragsinformationen und wird erst nach Abschluss der Ausführung der Aufträge in einer Hostkonsole angezeigt.
Type: | PSHost |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ThrottleLimit
Dieser Parameter begrenzt die Anzahl von Aufträgen, die gleichzeitig ausgeführt werden. Wenn Aufträge gestartet werden, werden sie in die Warteschlange gestellt und warten, bis ein Thread im Threadpool verfügbar ist, um den Auftrag auszuführen. Der Standardgrenzwert beträgt 5 Threads.
Die Größe des Threadpools ist global für die PowerShell-Sitzung. Die Angabe eines ThrottleLimits in einem Aufruf legt den Grenzwert für nachfolgende Aufrufe in derselben Sitzung fest.
Type: | Int32 |
Position: | Named |
Default value: | 5 |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Eingaben
Ausgaben
ThreadJob.ThreadJob