Start-ThreadJob
Skapar bakgrundsjobb som liknar cmdleten Start-Job.
Syntax
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 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 Start-Sleep i 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 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 rörobjekt 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 instruera ett jobb att dirigera alla värdutdata till en viss 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.
Parameteregenskaper
| Typ: | Object[] |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | 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.
Parameteregenskaper
| Typ: | String |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
FilePath
| Position: | 0 |
| Obligatorisk: | True |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | 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.
Parameteregenskaper
| Typ: | ScriptBlock |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | 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.
Parameteregenskaper
| Typ: | PSObject |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | True |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-Name
Anger ett beskrivande 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.
Parameteregenskaper
| Typ: | String |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | 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.
Parameteregenskaper
| Typ: | ScriptBlock |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
ScriptBlock
| Position: | 0 |
| Obligatorisk: | True |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
-StreamingHost
Den här parametern ger ett trådsäkert sätt att tillåta att Write-Host utdata går direkt till det skickade PSHost--objektet. Utan den går Write-Host utdata till dataströmsamlingen för jobbinformation och visas inte i en värdkonsol förrän jobben har körts.
Parameteregenskaper
| Typ: | PSHost |
| Standardvärde: | None |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | 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.
Parameteregenskaper
| Typ: | Int32 |
| Standardvärde: | 5 |
| Stöder jokertecken: | False |
| DontShow: | False |
Parameteruppsättningar
(All)
| Position: | Named |
| Obligatorisk: | False |
| Värde från pipeline: | False |
| Värde från pipeline efter egenskapsnamn: | False |
| Värde från återstående argument: | False |
CommonParameters
Den här cmdleten stöder vanliga parametrar: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction och -WarningVariable. Mer information finns i about_CommonParameters.