Start-ThreadJob
Tworzy zadania w tle podobne do polecenia cmdlet Start-Job.
Składnia
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>]
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 Invoke-WebRequest cmdlet może pobrać tylko jeden plik naraz. W poniższym przykładzie użyto Start-ThreadJob metody 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.
Właściwości parametru
| Typ: | Object[] |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowy: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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.
Właściwości parametru
| Typ: | String |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
FilePath
| Position: | 0 |
| Obowiązkowy: | True |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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 uruchamiane jest zadanie. Na przykład można go użyć do dodawania funkcji i modułów do sesji.
Właściwości parametru
| Typ: | ScriptBlock |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowy: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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.
Właściwości parametru
| Typ: | PSObject |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowy: | False |
| Wartość z potoku: | True |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
-Name
Określa przyjazną nazwę nowego zadania. Możesz użyć nazwy, aby zidentyfikować zadanie w odniesieniu do innych poleceń cmdlet dotyczących zadań, takie 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.
Właściwości parametru
| Typ: | String |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowy: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
-ScriptBlock
Określa polecenia, które mają być uruchomione 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.
Właściwości parametru
| Typ: | ScriptBlock |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
ScriptBlock
| Position: | 0 |
| Obowiązkowy: | True |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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ń.
Właściwości parametru
| Typ: | PSHost |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowy: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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.
Właściwości parametru
| Typ: | Int32 |
| Domyślna wartość: | 5 |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowy: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
CommonParameters
To polecenie cmdlet obsługuje typowe parametry: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction i -WarningVariable. Aby uzyskać więcej informacji, zobacz about_CommonParameters.