Share via


Start-ThreadJob

Skapar bakgrundsjobb som liknar cmdleten Start-Job .

Syntax

Start-ThreadJob
     [-ScriptBlock] <ScriptBlock>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [<CommonParameters>]
Start-ThreadJob
     [-FilePath] <String>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [<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

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

-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