Start-ThreadJob
Skapar bakgrundsjobb som liknar cmdleten 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
skapar bakgrundsjobb som liknar cmdleten Start-Job
. Den största skillnaden är att jobben som skapas körs i separata trådar i den lokala processen. Som standard använder jobben den aktuella arbetskatalogen för anroparen som startade jobbet.
Cmdleten stöder också en ThrottleLimit-parameter för att begränsa antalet jobb som körs samtidigt. När fler jobb startas placeras de i kö och väntar tills det aktuella antalet jobb sjunker under begränsningsgränsen.
Exempel
Exempel 1 – Skapa bakgrundsjobb med en trådgräns på 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;...
Exempel 2 – Jämför prestanda för Start-Job och Start-ThreadJob
Det här exemplet visar skillnaden mellan Start-Job
och Start-ThreadJob
. Jobben kör cmdleten i Start-Sleep
1 sekund. Eftersom jobben körs parallellt är den totala körningstiden cirka 1 sekund, plus den tid som krävs för att skapa jobben.
# 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
När du har subtraherat 1 sekund för körningstiden kan du se att det Start-Job
tar cirka 4,8 sekunder att skapa fem jobb. Start-ThreadJob
är 8 gånger snabbare, vilket tar cirka 0,6 sekunder att skapa fem jobb. Resultaten kan variera i din miljö, men den relativa förbättringen bör vara densamma.
Exempel 3 – Skapa jobb med InputObject
I det här exemplet använder skriptblocket variabeln $input
för att ta emot indata från parametern InputObject . Detta kan också göras genom att skicka objekt till 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
Exempel 4 – Strömma jobbutdata till överordnad värd
Med parametern StreamingHost kan du be ett jobb att dirigera alla värdutdata till en specifik värd. Utan den här parametern går utdata till jobbdataströmsamlingen och visas inte i en värdkonsol förrän du får utdata från jobbet.
I det här exemplet skickas den aktuella värden till Start-ThreadJob
med hjälp av den $Host
automatiska variabeln.
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>
Observera att uppmaningen från Read-Host
visas och att du kan skriva indata. Sedan visas meddelandet från Write-Warning
. Cmdleten Receive-Job
returnerar alla utdata från jobbet.
Exempel 5 – Ladda ned flera filer samtidigt
Cmdleten Invoke-WebRequest
kan bara ladda ned en fil i taget. I följande exempel används Start-ThreadJob
för att skapa flera trådjobb för att ladda ned flera filer samtidigt.
$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
}
Parametrar
-ArgumentList
Anger en matris med argument, eller parametervärden, för skriptet som anges av parametrarna FilePath eller ScriptBlock .
ArgumentList måste vara den sista parametern på kommandoraden. Alla värden som följer parameternamnet tolkas värden i argumentlistan.
Typ: | Object[] |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-FilePath
Anger en skriptfil som ska köras som ett bakgrundsjobb. Ange sökvägen och filnamnet för skriptet. Skriptet måste finnas på den lokala datorn eller i en mapp som den lokala datorn kan komma åt.
När du använder den här parametern konverterar PowerShell innehållet i den angivna skriptfilen till ett skriptblock och kör skriptblocket som ett bakgrundsjobb.
Typ: | String |
Position: | 0 |
Standardvärde: | None |
Obligatorisk: | True |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-InitializationScript
Anger kommandon som körs innan jobbet startar. Omslut kommandona i klammerparenteser ({}
) för att skapa ett skriptblock.
Använd den här parametern för att förbereda sessionen där jobbet körs. Du kan till exempel använda den för att lägga till funktioner och moduler i sessionen.
Typ: | ScriptBlock |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-InputObject
Anger de objekt som används som indata till skriptblocket. Det möjliggör även pipelineindata. Använd den $input
automatiska variabeln i skriptblocket för att komma åt indataobjekten.
Typ: | PSObject |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | True |
Godkänn jokertecken: | False |
-Name
Anger ett eget namn för det nya jobbet. Du kan använda namnet för att identifiera jobbet för andra jobb-cmdletar, till exempel cmdleten Stop-Job
.
Standardnamnet är "Job#", där "#" är ett ordningstal som ökas för varje jobb.
Typ: | String |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-ScriptBlock
Anger vilka kommandon som ska köras i bakgrundsjobbet. Omslut kommandona i klammerparenteser ({}
) för att skapa ett skriptblock. Använd den $Input
automatiska variabeln för att komma åt värdet för parametern InputObject . Den här parametern krävs.
Typ: | ScriptBlock |
Position: | 0 |
Standardvärde: | None |
Obligatorisk: | True |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-StreamingHost
Den här parametern ger ett trådsäkert sätt att tillåta Write-Host
att utdata går direkt till det skickade PSHost-objektet . Utan den Write-Host
går utdata till dataströmsamlingen för jobbinformation och visas inte i en värdkonsol förrän jobben har körts.
Typ: | PSHost |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-ThrottleLimit
Den här parametern begränsar antalet jobb som körs samtidigt. När jobben startas placeras de i kö och väntar tills en tråd är tillgänglig i trådpoolen för att köra jobbet. Standardgränsen är 5 trådar.
Trådpoolens storlek är global för PowerShell-sessionen. Om du anger en ThrottleLimit i ett anrop anges gränsen för efterföljande anrop i samma session.
Typ: | Int32 |
Position: | Named |
Standardvärde: | 5 |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
Indata
Utdata
ThreadJob.ThreadJob