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.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters: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.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters: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.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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.

Type:ScriptBlock
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters: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.

Type:PSHost
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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.

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

Indata

PSObject

Utdata

ThreadJob.ThreadJob