Start-ThreadJob

A parancsmaghoz Start-Job hasonló háttérfeladatokat hoz létre.

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 a parancsmaghoz Start-Job hasonló háttérfeladatokat hoz létre. A fő különbség az, hogy a létrehozott feladatok külön szálakban futnak a helyi folyamaton belül. Alapértelmezés szerint a feladatok a feladatot kezdeményező hívó aktuális munkakönyvtárát használják.

A parancsmag egy ThrottleLimit paramétert is támogat az egyszerre futó feladatok számának korlátozásához. A további feladatok indításakor a rendszer sorba állítja őket, és megvárja, amíg az aktuális feladatok száma a szabályozási korlát alá csökken.

Példák

1. példa – Háttérfeladatok létrehozása 2 szálkorláttal

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;...

2. példa – A start-job és a Start-ThreadJob teljesítményének összehasonlítása

Ez a példa a kettő közötti Start-JobStart-ThreadJobkülönbséget mutatja be. A feladatok 1 másodpercen át futtatják a Start-Sleep parancsmagot. Mivel a feladatok párhuzamosan futnak, a teljes végrehajtási idő körülbelül 1 másodperc, valamint a feladatok létrehozásához szükséges idő.

# 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

A végrehajtási idő 1 másodpercének kivonása után láthatja, hogy Start-Job öt feladat létrehozása körülbelül 4,8 másodpercet vesz igénybe. Start-ThreadJob 8-szor gyorsabb, és körülbelül 0,6 másodpercet vesz igénybe öt feladat létrehozásához. Az eredmények eltérőek lehetnek a környezetben, de a relatív javulásnak azonosnak kell lennie.

3. példa – Feladatok létrehozása az InputObject használatával

Ebben a példában a szkriptblokk a változót használja az $input InputObject paraméter bemenetének fogadására. Ezt úgy is megteheti, hogy az objektumokat a következőre Start-ThreadJobássa: .

$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

4. példa – Feladat kimenetének streamelése szülő gazdagépre

A StreamingHost paraméterrel megadhatja a feladatnak, hogy az összes gazdagép kimenetét egy adott gazdagépre irányítsa. E paraméter nélkül a kimenet a feladat adatfolyam-gyűjteményére kerül, és csak akkor jelenik meg a gazdagépkonzolon, ha megkapja a kimenetet a feladattól.

Ebben a példában az aktuális gazdagépet az automatikus változó használatával továbbítja Start-ThreadJob a $Host rendszer.

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>

Figyelje meg, hogy megjelenik a parancssor, Read-Host és beírhatja a bemenetet. Ezután megjelenik a feladó Write-Warning üzenete. A Receive-Job parancsmag a feladat összes kimenetét visszaadja.

5. példa – Egyszerre több fájl letöltése

A Invoke-WebRequest parancsmag egyszerre csak egy fájlt tud letölteni. Az alábbi példa több szálfeladat létrehozását használja Start-ThreadJob több fájl egyidejű letöltéséhez.

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

Paraméterek

-ArgumentList

A FilePath vagy a ScriptBlock paraméterek által megadott szkript argumentumainak vagy paraméterértékeinek tömbje.

Az argumentumlistának a parancssor utolsó paraméterének kell lennie. A paraméter nevét követő összes érték értelmezése az argumentumlistában történik.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

A háttérfeladatként futtatandó szkriptfájlt adja meg. Adja meg a szkript elérési útját és fájlnevét. A szkriptnek a helyi számítógépen vagy egy olyan mappában kell lennie, amelyhez a helyi számítógép hozzáférhet.

Ha ezt a paramétert használja, a PowerShell a megadott szkriptfájl tartalmát szkriptblokkmá alakítja, és háttérfeladatként futtatja a szkriptblokkot.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

A feladat indítása előtt futtatott parancsokat adja meg. A parancsokat kapcsos zárójelekbe ({}) ágyazva hozzon létre egy szkriptblokkot.

Ezzel a paraméterel előkészíti a munkamenetet, amelyben a feladat fut. Segítségével például függvényeket és modulokat adhat hozzá a munkamenethez.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Megadja a szkriptblokk bemeneteként használt objektumokat. Lehetővé teszi a folyamatbemenetet is. Használja a $input szkriptblokk automatikus változóját a bemeneti objektumok eléréséhez.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Name

Az új feladat rövid nevét adja meg. A névvel azonosíthatja a feladatot más feladatparancsmagok, például a Stop-Job parancsmagok számára.

Az alapértelmezett rövid név a "Feladat#", ahol a "#" egy sorszám, amely az egyes feladatokhoz növekszik.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

Megadja a háttérfeladatban futtatandó parancsokat. A parancsokat kapcsos zárójelekbe ({}) ágyazva hozzon létre egy szkriptblokkot. $Input Az automatikus változóval érheti el az InputObject paraméter értékét. Ez a paraméter kötelező.

Type:ScriptBlock
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-StreamingHost

Ez a paraméter biztonságos módot biztosít a szál biztonságos használatával, hogy Write-Host a kimenet közvetlenül az átadott PSHost-objektumra menjen. Nélküle a kimenet a feladatadatok adatfolyam-gyűjteményére kerül, Write-Host és csak a feladatok futtatása után jelenik meg a gazdagépkonzolon.

Type:PSHost
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ThrottleLimit

Ez a paraméter korlátozza az egyszerre futó feladatok számát. A feladatok indításakor várólistára kerülnek, és megvárják, amíg egy szál elérhető a szálkészletben a feladat futtatásához. Az alapértelmezett korlát 5 szál.

A szálkészlet mérete globális a PowerShell-munkamenetre. Ha egy hívásban megad egy ThrottleLimit-et , akkor az ugyanabban a munkamenetben a későbbi hívásokra vonatkozó korlátot határozza meg.

Type:Int32
Position:Named
Default value:5
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Bevitelek

PSObject

Kimenetek

ThreadJob.ThreadJob