Start-ThreadJob
Vytvoří úlohy na pozadí podobné rutině Start-Job
.
Syntaxe
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ů.
Typ: | Object[] |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | 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í.
Typ: | String |
Position: | 0 |
Default value: | None |
Vyžadováno: | True |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | 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.
Typ: | ScriptBlock |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | 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.
Typ: | PSObject |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | True |
Přijmout zástupné znaky: | 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ýší.
Typ: | String |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | 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ý.
Typ: | ScriptBlock |
Position: | 0 |
Default value: | None |
Vyžadováno: | True |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | 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čí.
Typ: | PSHost |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | 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.
Typ: | Int32 |
Position: | Named |
Default value: | 5 |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
Vstupy
Výstupy
ThreadJob.ThreadJob