Udostępnij za pośrednictwem


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

PSObject

Dane wyjściowe

ThreadJob.ThreadJob