Freigeben über


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 Hauptunterschied 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 einzuschränken. Wenn weitere Aufträge gestartet werden, werden sie in die Warteschlange gestellt und warten, bis die aktuelle Anzahl von Aufträgen unter dem Drosselungslimit liegt.

Beispiele

Beispiel 1 : Erstellen von Hintergrundaufträgen mit einer Threadgrenze 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 – Vergleich der Leistung von Start-Job und Start-ThreadJob

In diesem Beispiel wird der Unterschied zwischen Start-Job und Start-ThreadJob. Die Aufträge führen das Start-Sleep Cmdlet für 1 Sekunde aus. Da die Aufträge parallel ausgeführt werden, beträgt die Gesamtausführungszeit etwa 1 Sekunde, plus jedes Mal, das zum Erstellen der Aufträge erforderlich ist.

# 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 können Sie sehen, dass Start-Job etwa 4,8 Sekunden dauert, um fünf Aufträge zu erstellen. Start-ThreadJob ist 8 Mal schneller und dauert etwa 0,6 Sekunden, um fünf Arbeitsplätze zu erstellen. Die Ergebnisse können in Ihrer Umgebung variieren, die relative Verbesserung sollte jedoch identisch sein.

Beispiel 3 : Erstellen 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 durch das Anfügen von Objekten an 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 : Streamauftragsausgabe auf übergeordneten Host

Mithilfe des StreamingHost-Parameters können Sie einen Auftrag anweisen, die gesamte Hostausgabe an einen bestimmten Host zu leiten. Ohne diesen Parameter wechselt die Ausgabe zur Datenstromsammlung des Auftrags und wird erst in einer Hostkonsole angezeigt, wenn Sie die Ausgabe vom Auftrag erhalten.

In diesem Beispiel wird der aktuelle Host an die Verwendung der $Host automatischen Variablen ü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 Read-Host angezeigt wird und Sie Eingaben eingeben können. Anschließend wird die Nachricht 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 werden Start-ThreadJob mehrere Threadaufträge erstellt, 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 von den Parametern FilePath oder ScriptBlock angegeben wird.

ArgumentList muss der letzte Parameter in der Befehlszeile sein. Alle Werte, die dem Parameternamen folgen, werden in der Argumentliste interpretiert.

Typ:Object[]
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren: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.

Typ:String
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren: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.

Typ:ScriptBlock
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-InputObject

Gibt die Objekte an, die als Eingabe für den Skriptblock verwendet werden. Sie ermöglicht auch die Pipelineeingabe. Verwenden Sie die $input automatische Variable im Skriptblock, um auf die Eingabeobjekte zuzugreifen.

Typ:PSObject
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren: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.

Typ:String
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren: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.

Typ:ScriptBlock
Position:0
Standardwert:None
Erforderlich:True
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-StreamingHost

Dieser Parameter bietet eine threadsichere Möglichkeit, die Ausgabe direkt zum übergebenen PSHost-Objekt zu ermöglichenWrite-Host. Ohne diesen Write-Host Vorgang wechselt die Ausgabe zur Datenstromsammlung für Auftragsinformationen und wird erst nach Abschluss der Ausführung der Aufträge in einer Hostkonsole angezeigt.

Typ:PSHost
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren: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 Threadpoolgröße ist global für die PowerShell-Sitzung. Wenn Sie in einem Aufruf ein ThrottleLimit angeben, wird der Grenzwert für nachfolgende Anrufe in derselben Sitzung festgelegt.

Typ:Int32
Position:Named
Standardwert:5
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

Eingaben

PSObject

Ausgaben

ThreadJob.ThreadJob