Start-ThreadJob
Tworzy zadania w tle podobne do polecenia cmdlet Start-Job
.
Składnia
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>]
Opis
Start-ThreadJob
tworzy zadania w tle podobne do polecenia cmdlet Start-Job
. Główną różnicą jest to, że zadania, które są tworzone w osobnych wątkach w ramach procesu lokalnego. Domyślnie zadania używają bieżącego katalogu roboczego obiektu wywołującego, który uruchomił zadanie.
Polecenie cmdlet obsługuje również parametr ThrottleLimit, aby ograniczyć liczbę uruchomionych zadań jednocześnie. W miarę uruchamiania większej liczby zadań są one kolejkowane i czekają, aż bieżąca liczba zadań spadnie poniżej limitu ograniczenia.
Przykłady
Przykład 1 — tworzenie zadań w tle z limitem wątków 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;...
Przykład 2 — porównanie wydajności Start-Job i Start-ThreadJob
W tym przykładzie przedstawiono różnicę między Start-Job
a Start-ThreadJob
. Zadania uruchamiają polecenie cmdlet Start-Sleep
przez 1 sekundę. Ponieważ zadania są uruchamiane równolegle, łączny czas wykonywania wynosi około 1 sekundy oraz czas wymagany do utworzenia zadań.
# 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
Po odjęciu 1 sekundy na czas wykonywania można zobaczyć, że Start-Job
trwa około 4,8 sekundy, aby utworzyć pięć zadań.
Start-ThreadJob
jest 8 razy szybszy, utworzenie pięciu zadań zajmuje około 0,6 sekund. Wyniki mogą się różnić w danym środowisku, ale względna poprawa powinna być taka sama.
Przykład 3 — tworzenie zadań przy użyciu obiektu InputObject
W tym przykładzie blok skryptu używa zmiennej $input
do odbierania danych wejściowych z parametru InputObject. Można to również zrobić przez potokowanie obiektów w celu 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
Przykład 4 — przesyłanie strumieniowe danych wyjściowych zadania do hosta nadrzędnego
Korzystając z parametru StreamingHost, możesz poinformować zadanie o przekierowaniu wszystkich danych wyjściowych hosta do określonego hosta. Bez tego parametru dane wyjściowe przechodzą do zbierania strumienia danych zadania i nie są wyświetlane w konsoli hosta do momentu otrzymania danych wyjściowych z zadania.
W tym przykładzie bieżący host jest przekazywany do Start-ThreadJob
przy użyciu zmiennej automatycznej $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>
Zwróć uwagę, że monit z Read-Host
jest wyświetlany i można wpisać dane wejściowe. Następnie zostanie wyświetlony komunikat z Write-Warning
. Polecenie cmdlet Receive-Job
zwraca wszystkie dane wyjściowe z zadania.
Przykład 5 — pobieranie wielu plików w tym samym czasie
Polecenie cmdlet Invoke-WebRequest
może pobierać tylko jeden plik jednocześnie. W poniższym przykładzie użyto Start-ThreadJob
do utworzenia wielu zadań wątku w celu pobrania wielu plików w tym samym czasie.
$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
}
Parametry
-ArgumentList
Określa tablicę argumentów lub wartości parametrów dla skryptu określonego przez parametr FilePath lub ScriptBlock parametrów.
ArgumentList musi być ostatnim parametrem w wierszu polecenia. Wszystkie wartości, które są zgodne z nazwą parametru, są interpretowane wartości na liście argumentów.
Typ: | Object[] |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | False |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-FilePath
Określa plik skryptu do uruchomienia jako zadanie w tle. Wprowadź ścieżkę i nazwę pliku skryptu. Skrypt musi znajdować się na komputerze lokalnym lub w folderze, do którego ma dostęp komputer lokalny.
W przypadku użycia tego parametru program PowerShell konwertuje zawartość określonego pliku skryptu na blok skryptu i uruchamia blok skryptu jako zadanie w tle.
Typ: | String |
Position: | 0 |
Domyślna wartość: | None |
Wymagane: | True |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-InitializationScript
Określa polecenia uruchamiane przed uruchomieniem zadania. Dołącz polecenia w nawiasach klamrowych ({}
), aby utworzyć blok skryptu.
Użyj tego parametru, aby przygotować sesję, w której jest uruchamiane zadanie. Na przykład można go użyć do dodawania funkcji i modułów do sesji.
Typ: | ScriptBlock |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | False |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-InputObject
Określa obiekty używane jako dane wejściowe bloku skryptu. Umożliwia również wprowadzanie danych wejściowych potoku. Użyj zmiennej automatycznej $input
w bloku skryptu, aby uzyskać dostęp do obiektów wejściowych.
Typ: | PSObject |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | False |
Akceptowanie danych wejściowych potoku: | True |
Akceptowanie symboli wieloznacznych: | False |
-Name
Określa przyjazną nazwę nowego zadania. Możesz użyć nazwy , aby zidentyfikować zadanie do innych poleceń cmdlet zadania, takich jak polecenie cmdlet Stop-Job
.
Domyślna przyjazna nazwa to "Job#", gdzie "#" jest liczbą porządkową, która jest zwiększana dla każdego zadania.
Typ: | String |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | False |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-ScriptBlock
Określa polecenia do uruchomienia w zadaniu w tle. Dołącz polecenia w nawiasach klamrowych ({}
), aby utworzyć blok skryptu. Użyj zmiennej automatycznej $Input
, aby uzyskać dostęp do wartości parametru InputObject. Ten parametr jest wymagany.
Typ: | ScriptBlock |
Position: | 0 |
Domyślna wartość: | None |
Wymagane: | True |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-StreamingHost
Ten parametr zapewnia bezpieczny wątek sposób zezwalania Write-Host
danych wyjściowych bezpośrednio do przekazanego obiektu PSHost. Bez niego dane wyjściowe Write-Host
są przesyłane do zbierania strumienia danych informacji o zadaniu i nie są wyświetlane w konsoli hosta do momentu zakończenia wykonywania zadań.
Typ: | PSHost |
Position: | Named |
Domyślna wartość: | None |
Wymagane: | False |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
-ThrottleLimit
Ten parametr ogranicza liczbę uruchomionych zadań jednocześnie. W miarę uruchamiania zadań są one kolejkowane i czekają, aż wątek będzie dostępny w puli wątków, aby uruchomić zadanie. Domyślny limit to 5 wątków.
Rozmiar puli wątków jest globalny dla sesji programu PowerShell. Określenie throttleLimit w jednym wywołaniu ustawia limit dla kolejnych wywołań w tej samej sesji.
Typ: | Int32 |
Position: | Named |
Domyślna wartość: | 5 |
Wymagane: | False |
Akceptowanie danych wejściowych potoku: | False |
Akceptowanie symboli wieloznacznych: | False |
Dane wejściowe
Dane wyjściowe
ThreadJob.ThreadJob