Start-ThreadJob
Hiermee maakt u achtergrondtaken die vergelijkbaar zijn met de Start-Job cmdlet.
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 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. Standaard gebruiken de taken de huidige werkmap van de aanroeper die de taak heeft gestart.
De cmdlet ondersteunt ook een ThrottleLimit-parameter om het aantal taken dat tegelijk wordt uitgevoerd, te beperken. Naarmate er meer taken worden gestart, worden ze in de wachtrij geplaatst en worden ze in de wachtrij geplaatst totdat het huidige aantal taken onder de beperkingslimiet valt.
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 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
Na het aftrekken van 1 seconde voor uitvoeringstijd, kunt u zien dat Start-Job het 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 door te sluisen naar 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 het gebruik van de $Host automatische variabele.
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 wordt Read-Host weergegeven en dat u invoer kunt typen. Vervolgens wordt het bericht vandaan Write-Warning weergegeven. De Receive-Job cmdlet retourneert alle uitvoer van de taak.
Voorbeeld 5: meerdere bestanden tegelijk downloaden
De Invoke-WebRequest cmdlet kan slechts één bestand tegelijk downloaden. In het volgende voorbeeld wordt gebruikgemaakt Start-ThreadJob van het maken van meerdere threadtaken 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
Hiermee geeft u een matrix met argumenten of parameterwaarden op voor het script dat is opgegeven door de parameters FilePath of ScriptBlock .
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.
| Type: | Object[] |
| Position: | Named |
| Default value: | None |
| Accept pipeline input: | False |
| Accept wildcard characters: | False |
Hiermee geeft u een scriptbestand op dat moet worden uitgevoerd als 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.
| Type: | String |
| Position: | 0 |
| Default value: | None |
| Accept pipeline input: | False |
| Accept wildcard characters: | False |
Hiermee geeft u opdrachten op 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.
| Type: | ScriptBlock |
| Position: | Named |
| Default value: | None |
| Accept pipeline input: | False |
| Accept wildcard characters: | False |
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.
| Type: | PSObject |
| Position: | Named |
| Default value: | None |
| Accept pipeline input: | True |
| Accept wildcard characters: | False |
Hiermee geeft u een beschrijvende 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.
| Type: | String |
| Position: | Named |
| Default value: | None |
| Accept pipeline input: | False |
| Accept wildcard characters: | False |
Hiermee geeft u de opdrachten die moeten worden uitgevoerd in de achtergrondtaak. 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.
| Type: | ScriptBlock |
| Position: | 0 |
| Default value: | None |
| Accept pipeline input: | False |
| Accept wildcard characters: | False |
Deze parameter biedt een veilige thread-manier om uitvoer rechtstreeks naar het doorgegeven PSHost-object toe te staanWrite-Host. Write-Host Zonder deze taak gaat de uitvoer naar het verzamelen van taakgegevensstromen en wordt deze pas weergegeven in een hostconsole nadat de taken zijn uitgevoerd.
| Type: | PSHost |
| Position: | Named |
| Default value: | None |
| Accept pipeline input: | False |
| Accept wildcard characters: | False |
Met deze parameter wordt het aantal taken dat tegelijk wordt uitgevoerd, beperkt. Wanneer taken worden gestart, worden ze in de wachtrij geplaatst en gewacht totdat een thread beschikbaar is in de threadgroep om de taak uit te voeren. De standaardlimiet is 5 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.
| Type: | Int32 |
| Position: | Named |
| Default value: | 5 |
| Accept pipeline input: | False |
| Accept wildcard characters: | False |
Invoerwaarden
Uitvoerwaarden
ThreadJob.ThreadJob
Verwante koppelingen
Feedback
Feedback verzenden en weergeven voor