Delen via


Start-ThreadJob

Hiermee maakt u achtergrondtaken die vergelijkbaar zijn met de Start-Job-cmdlet.

Syntaxis

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 maakt achtergrondtaken die vergelijkbaar zijn met de Start-Job-cmdlet. Het belangrijkste verschil is dat de taken die worden gemaakt, worden uitgevoerd in afzonderlijke threads binnen het lokale proces. De taken gebruiken standaard de huidige werkmap van de aanroeper die de taak heeft gestart.

De cmdlet ondersteunt ook een ThrottleLimit parameter om het aantal taken dat tegelijkertijd wordt uitgevoerd te beperken. Naarmate er meer taken worden gestart, worden ze in de wachtrij geplaatst en gewacht totdat het huidige aantal taken onder de beperkingslimiet daalt.

Voorbeelden

Voorbeeld 1: achtergrondtaken maken met een threadlimiet van 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;...

Voorbeeld 2: de prestaties van Start-Job en Start-ThreadJob vergelijken

In dit voorbeeld ziet u het verschil tussen Start-Job en Start-ThreadJob. De taken voeren de Start-Sleep cmdlet voor 1 seconde uit. Omdat de taken parallel worden uitgevoerd, is de totale uitvoeringstijd ongeveer 1 seconde, plus elke tijd die nodig is om de taken te maken.

# 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

Nadat u 1 seconde hebt afgetrokken voor de uitvoeringstijd, kunt u zien dat Start-Job ongeveer 4,8 seconden duurt om vijf taken te maken. Start-ThreadJob is 8 keer sneller, het duurt ongeveer 0,6 seconden om vijf taken te maken. De resultaten kunnen variëren in uw omgeving, maar de relatieve verbetering moet hetzelfde zijn.

Voorbeeld 3: Taken maken met Behulp van InputObject

In dit voorbeeld gebruikt het scriptblok de $input variabele om invoer te ontvangen van de parameter InputObject. Dit kan ook worden gedaan door objecten naar Start-ThreadJobte 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

Voorbeeld 4: uitvoer van streamtaak naar bovenliggende host

Met behulp van de parameter StreamingHost kunt u een taak vertellen om alle hostuitvoer naar een specifieke host te leiden. Zonder deze parameter gaat de uitvoer naar de verzameling taakgegevensstromen en wordt deze pas weergegeven in een hostconsole als u de uitvoer van de taak ontvangt.

In dit voorbeeld wordt de huidige host doorgegeven aan Start-ThreadJob met behulp van de automatische variabele $Host.

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>

U ziet dat de prompt van Read-Host wordt weergegeven en u invoer kunt typen. Vervolgens wordt het bericht van Write-Warning weergegeven. De Receive-Job cmdlet retourneert alle uitvoer van de taak.

Voorbeeld 5: meerdere bestanden tegelijk downloaden

De cmdlet Invoke-WebRequest kan slechts één bestand tegelijk downloaden. In het volgende voorbeeld wordt Start-ThreadJob gebruikt om meerdere threadtaken te maken om meerdere bestanden tegelijk te downloaden.

$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
}

Parameters

-ArgumentList

Hiermee geeft u een matrix van argumenten, of parameterwaarden, op voor het script dat is opgegeven door de FilePath of ScriptBlock parameters.

ArgumentList- moet de laatste parameter op de opdrachtregel zijn. Alle waarden die de parameternaam volgen, worden geïnterpreteerd als waarden in de lijst met argumenten.

Parametereigenschappen

Type:

Object[]

Default value:None
Ondersteunt jokertekens:False
DontShow:False

Parametersets

(All)
Position:Named
Verplicht:False
Waarde uit pijplijn:False
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

-FilePath

Hiermee geeft u een scriptbestand dat moet worden uitgevoerd als een achtergrondtaak. Voer het pad en de bestandsnaam van het script in. Het script moet zich op de lokale computer of in een map bevinden waartoe de lokale computer toegang heeft.

Wanneer u deze parameter gebruikt, converteert PowerShell de inhoud van het opgegeven scriptbestand naar een scriptblok en voert het scriptblok uit als achtergrondtaak.

Parametereigenschappen

Type:String
Default value:None
Ondersteunt jokertekens:False
DontShow:False

Parametersets

FilePath
Position:0
Verplicht:True
Waarde uit pijplijn:False
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

-InitializationScript

Hiermee geeft u opdrachten die worden uitgevoerd voordat de taak wordt gestart. Plaats de opdrachten tussen accolades ({}) om een scriptblok te maken.

Gebruik deze parameter om de sessie voor te bereiden waarin de taak wordt uitgevoerd. U kunt deze bijvoorbeeld gebruiken om functies en modules toe te voegen aan de sessie.

Parametereigenschappen

Type:ScriptBlock
Default value:None
Ondersteunt jokertekens:False
DontShow:False

Parametersets

(All)
Position:Named
Verplicht:False
Waarde uit pijplijn:False
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

-InputObject

Hiermee geeft u de objecten op die worden gebruikt als invoer voor het scriptblok. Het maakt ook pijplijninvoer mogelijk. Gebruik de $input automatische variabele in het scriptblok om toegang te krijgen tot de invoerobjecten.

Parametereigenschappen

Type:PSObject
Default value:None
Ondersteunt jokertekens:False
DontShow:False

Parametersets

(All)
Position:Named
Verplicht:False
Waarde uit pijplijn:True
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

-Name

Specificeert een vriendelijke naam voor de nieuwe taak. U kunt de naam gebruiken om de taak te identificeren voor andere taak-cmdlets, zoals de Stop-Job cmdlet.

De standaard beschrijvende naam is 'Job#', waarbij '#' een rangnummer is dat voor elke taak wordt verhoogd.

Parametereigenschappen

Type:String
Default value:None
Ondersteunt jokertekens:False
DontShow:False

Parametersets

(All)
Position:Named
Verplicht:False
Waarde uit pijplijn:False
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

-ScriptBlock

Hiermee geeft u de opdrachten die in de achtergrondtaak moeten worden uitgevoerd. Plaats de opdrachten tussen accolades ({}) om een scriptblok te maken. Gebruik de $input automatische variabele om toegang te krijgen tot de waarde van de parameter InputObject. Deze parameter is vereist.

Parametereigenschappen

Type:ScriptBlock
Default value:None
Ondersteunt jokertekens:False
DontShow:False

Parametersets

ScriptBlock
Position:0
Verplicht:True
Waarde uit pijplijn:False
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

-StreamingHost

Deze parameter biedt een veilige manier om Write-Host uitvoer rechtstreeks naar het doorgegeven PSHost--object te laten gaan. Zonder dit gaat Write-Host uitvoer naar de gegevensstroomverzameling voor taakgegevens en wordt deze pas weergegeven in een hostconsole nadat de taken zijn uitgevoerd.

Parametereigenschappen

Type:PSHost
Default value:None
Ondersteunt jokertekens:False
DontShow:False

Parametersets

(All)
Position:Named
Verplicht:False
Waarde uit pijplijn:False
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

-ThrottleLimit

Deze parameter beperkt het aantal taken dat tegelijk wordt uitgevoerd. Wanneer taken worden gestart, worden ze in de wachtrij geplaatst en wachten totdat een thread beschikbaar is in de threadpool om de taak uit te voeren. De standaardlimiet is vijf threads.

De grootte van de threadpool is globaal voor de PowerShell-sessie. Als u een ThrottleLimit in één aanroep opgeeft, wordt de limiet ingesteld voor volgende aanroepen in dezelfde sessie.

Parametereigenschappen

Type:Int32
Default value:5
Ondersteunt jokertekens:False
DontShow:False

Parametersets

(All)
Position:Named
Verplicht:False
Waarde uit pijplijn:False
Waarde uit pijplijn op eigenschapsnaam:False
Waarde van resterende argumenten:False

CommonParameters

Deze cmdlet ondersteunt de algemene parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction en -WarningVariable. Zie about_CommonParametersvoor meer informatie.

Invoerwaarden

PSObject

Uitvoerwaarden

ThreadJob.ThreadJob