Start-ThreadJob

Vytvoří úlohy na pozadí podobné rutině Start-Job .

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

Description

Start-ThreadJob vytvoří úlohy na pozadí podobné rutině Start-Job . Hlavní rozdíl spočívá v tom, že úlohy, které jsou vytvořeny, běží v samostatných vláknech v rámci místního procesu. Ve výchozím nastavení používají úlohy aktuální pracovní adresář volajícího, který úlohu spustil.

Rutina také podporuje parametr ThrottleLimit , který omezuje počet spuštěných úloh najednou. S tím, jak se spustí více úloh, se zařadí do fronty a počká, až aktuální počet úloh klesne pod limit omezení.

Příklady

Příklad 1 – Vytvoření úloh na pozadí s limitem vlákna 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;...

Příklad 2 – Porovnání výkonu spouštěcí úlohy a úlohy Start-ThreadJob

Tento příklad ukazuje rozdíl mezi Start-Job a Start-ThreadJob. Úlohy spouští rutinu Start-Sleep po dobu 1 sekundy. Vzhledem k tomu, že se úlohy spouští paralelně, celková doba provádění je přibližně 1 sekunda a kdykoli je potřeba k vytvoření úloh.

# 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

Po odečtení 1 sekundy za dobu provádění uvidíte, že Start-Job vytvoření pěti úloh trvá přibližně 4,8 sekundy. Start-ThreadJob je 8krát rychlejší a vytvoření pěti úloh trvá přibližně 0,6 sekundy. Výsledky se můžou ve vašem prostředí lišit, ale relativní zlepšení by mělo být stejné.

Příklad 3 – Vytvoření úloh pomocí InputObjectu

V tomto příkladu blok skriptu používá proměnnou $input k příjmu vstupu z InputObject parametru. To lze provést také propojením objektů do 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

Příklad 4 – Výstup úlohy streamu do nadřazeného hostitele

Pomocí parametru StreamingHost můžete úlohu sdělit, aby všechny výstupy hostitele směrovat na konkrétního hostitele. Bez tohoto parametru výstup přejde do kolekce datových proudů úloh a nezobrazí se v konzole hostitele, dokud neobdržíte výstup z úlohy.

V tomto příkladu se aktuální hostitel předá Start-ThreadJob pomocí $Host automatické proměnné.

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>

Všimněte si, že se zobrazí výzva a Read-Host můžete zadat vstup. Pak se zobrazí zpráva z Write-Warning . Rutina Receive-Job vrátí veškerý výstup z úlohy.

Příklad 5 – Stažení více souborů najednou

Rutina Invoke-WebRequest může stáhnout jenom jeden soubor najednou. Následující příklad používá Start-ThreadJob k vytvoření více úloh vlákna ke stažení více souborů najednou.

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

Parametry

-ArgumentList

Určuje pole argumentů nebo hodnot parametrů pro skript určený parametry FilePath nebo ScriptBlock .

ArgumentList musí být posledním parametrem na příkazovém řádku. Všechny hodnoty, které následují za názvem parametru, jsou interpretovány hodnoty v seznamu argumentů.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

Určuje soubor skriptu, který se má spustit jako úloha na pozadí. Zadejte cestu a název souboru skriptu. Skript musí být v místním počítači nebo ve složce, ke které má místní počítač přístup.

Při použití tohoto parametru PowerShell převede obsah zadaného souboru skriptu na blok skriptu a spustí blok skriptu jako úlohu na pozadí.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

Určuje příkazy, které se spustí před spuštěním úlohy. Uzavřete příkazy do složených závorek ({}) a vytvořte blok skriptu.

Tento parametr použijte k přípravě relace, ve které se úloha spouští. Můžete ho například použít k přidání funkcí a modulů do relace.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Určuje objekty použité jako vstup do bloku skriptu. Umožňuje také vstup kanálu. Pro přístup ke vstupním objektům použijte automatickou $input proměnnou v bloku skriptu.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Name

Určuje popisný název nové úlohy. Název můžete použít k identifikaci úlohy pro jiné rutiny úloh, jako je například rutina Stop-Job .

Výchozí popisný název je Job#, kde #je pořadové číslo, které se pro každou úlohu zvýší.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

Určuje příkazy, které se mají spustit v úloze na pozadí. Uzavřete příkazy do složených závorek ({}) a vytvořte blok skriptu. $Input Pro přístup k hodnotě parametru InputObject použijte automatickou proměnnou. Tento parametr je povinný.

Type:ScriptBlock
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-StreamingHost

Tento parametr poskytuje bezpečný způsob, jak povolit Write-Host výstup přejít přímo do předaného objektu PSHost . Bez něj výstup přejde do shromažďování datových proudů dat úlohy a nezobrazí se v konzole hostitele, Write-Host dokud se úlohy nedokončí.

Type:PSHost
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ThrottleLimit

Tento parametr omezuje počet úloh spuštěných najednou. Při spuštění úloh se zařadí do fronty a počká, až bude ve fondu vláken k dispozici vlákno, aby se úloha spustila. Výchozí limit je 5 vláken.

Velikost fondu vláken je globální pro relaci PowerShellu. Při zadání throttleLimit v jednom volání se nastaví limit pro následná volání ve stejné relaci.

Type:Int32
Position:Named
Default value:5
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Vstupy

PSObject

Výstupy

ThreadJob.ThreadJob