Sdílet prostřednictvím


Start-ThreadJob

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

Syntaxe

ScriptBlock

Start-ThreadJob
    [-ScriptBlock] <ScriptBlock>
    [-Name <String>]
    [-InitializationScript <ScriptBlock>]
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-ThrottleLimit <Int32>]
    [-StreamingHost <PSHost>]
    [<CommonParameters>]

FilePath

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, aby se omezil 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 Start-Job a 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 nasměrovály 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 z Read-Host a můžete zadat vstup. Pak se zobrazí zpráva z Write-Warning. Rutina Receive-Job vrátí veškerý výstup ú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ý FilePath nebo ScriptBlock parametry.

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

Vlastnosti parametru

Typ:

Object[]

Default value:None
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

(All)
Position:Named
Povinné:False
Hodnota z kanálu:False
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů: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í.

Vlastnosti parametru

Typ:String
Default value:None
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

FilePath
Position:0
Povinné:True
Hodnota z kanálu:False
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů: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.

Vlastnosti parametru

Typ:ScriptBlock
Default value:None
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

(All)
Position:Named
Povinné:False
Hodnota z kanálu:False
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů: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 $input automatickou proměnnou v bloku skriptu.

Vlastnosti parametru

Typ:PSObject
Default value:None
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

(All)
Position:Named
Povinné:False
Hodnota z kanálu:True
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů:False

-Name

Určuje přátelský název nové úlohy. Název můžete použít k identifikaci úlohy do jiných rutin ú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ýší.

Vlastnosti parametru

Typ:String
Default value:None
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

(All)
Position:Named
Povinné:False
Hodnota z kanálu:False
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů: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. Použijte $input automatickou proměnnou pro přístup k hodnotě InputObject parametru. Tento parametr je povinný.

Vlastnosti parametru

Typ:ScriptBlock
Default value:None
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

ScriptBlock
Position:0
Povinné:True
Hodnota z kanálu:False
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů:False

-StreamingHost

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

Vlastnosti parametru

Typ:PSHost
Default value:None
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

(All)
Position:Named
Povinné:False
Hodnota z kanálu:False
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů: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. Zadání ThrottleLimit v jednom volání nastaví limit pro další volání ve stejné relaci.

Vlastnosti parametru

Typ:Int32
Default value:5
Podporuje zástupné znaky:False
DontShow:False

Sady parametrů

(All)
Position:Named
Povinné:False
Hodnota z kanálu:False
Hodnota z kanálu podle názvu vlastnosti:False
Hodnota ze zbývajících argumentů:False

CommonParameters

Tato rutina podporuje běžné parametry: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction a -WarningVariable. Další informace najdete v about_CommonParameters.

Vstupy

PSObject

Výstupy

ThreadJob.ThreadJob