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 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

PSObject

Ausgaben

ThreadJob.ThreadJob