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>]
[<CommonParameters>]
Start-ThreadJob
[-FilePath] <String>
[-Name <String>]
[-InitializationScript <ScriptBlock>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-ThrottleLimit <Int32>]
[<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
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 |
-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