Start-ThreadJob

cmdlet'ine Start-Job benzer arka plan işleri oluşturur.

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 cmdlet'ine Start-Job benzer arka plan işleri oluşturur. Temel fark, oluşturulan işlerin yerel işlem içinde ayrı iş parçacıklarında çalıştırılmasıdır. Varsayılan olarak, işler işi başlatan çağıranın geçerli çalışma dizinini kullanır.

Cmdlet, aynı anda çalışan iş sayısını sınırlamak için bir ThrottleLimit parametresini de destekler. Daha fazla iş başlatıldıkçe kuyruğa alınır ve geçerli iş sayısı azaltma sınırının altına düşene kadar bekler.

Örnekler

Örnek 1 - İş parçacığı sınırı 2 olan arka plan işleri oluşturma

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

Örnek 2 - Start-Job ve Start-ThreadJob performansını karşılaştırma

Bu örnekte ve Start-ThreadJobarasındaki Start-Job fark gösterilir. İşler cmdlet'ini Start-Sleep 1 saniye boyunca çalıştırır. İşler paralel çalıştığından, toplam yürütme süresi yaklaşık 1 saniyedir ve işleri oluşturmak için gereken süredir.

# 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

Yürütme süresi için 1 saniye çıkardıktan sonra beş iş oluşturmanın yaklaşık 4,8 saniye sürdüğünü Start-Job görebilirsiniz. Start-ThreadJob 8 kat daha hızlıdır ve beş iş oluşturmak yaklaşık 0,6 saniye sürer. Sonuçlar ortamınızda farklılık gösterebilir, ancak göreli iyileştirme aynı olmalıdır.

Örnek 3 - InputObject kullanarak iş oluşturma

Bu örnekte betik bloğu, InputObject parametresinden giriş almak için değişkenini kullanır$input. Bu, nesneleri öğesine Start-ThreadJobborulama yoluyla da yapılabilir.

$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

Örnek 4 - İş çıkışını üst konağa akışla aktar

StreamingHost parametresini kullanarak bir işe tüm konak çıkışını belirli bir konağa yönlendirmesini söyleyebilirsiniz. Bu parametre olmadan çıkış, iş veri akışı koleksiyonuna gider ve siz işten çıktıyı alıncaya kadar konak konsolunda görünmez.

Bu örnekte, geçerli ana bilgisayar otomatik değişken kullanılarak $Host öğesine Start-ThreadJob geçirilir.

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>

isteminin Read-Host görüntülendiğine ve giriş yazabildiğinize dikkat edin. Ardından, iletisi Write-Warning görüntülenir. Receive-Job Cmdlet, işten gelen tüm çıkışı döndürür.

Örnek 5 - Aynı anda birden çok dosya indirme

Invoke-WebRequest Cmdlet aynı anda yalnızca bir dosya indirebilir. Aşağıdaki örnek, aynı anda birden çok dosya indirmek üzere birden çok iş parçacığı işi oluşturmak için kullanır Start-ThreadJob .

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

Parametreler

-ArgumentList

FilePath veya ScriptBlock parametreleri tarafından belirtilen betik için bir bağımsız değişken dizisini veya parametre değerlerini belirtir.

ArgumentList , komut satırındaki son parametre olmalıdır. Parametre adını izleyen tüm değerler bağımsız değişken listesindeki yorumlanan değerlerdir.

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

-FilePath

Arka plan işi olarak çalıştırılacak bir betik dosyası belirtir. Betiğin yolunu ve dosya adını girin. Betik yerel bilgisayarda veya yerel bilgisayarın erişebileceği bir klasörde olmalıdır.

Bu parametreyi kullandığınızda PowerShell, belirtilen betik dosyasının içeriğini bir betik bloğuna dönüştürür ve betik bloğunu arka plan işi olarak çalıştırır.

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

-InitializationScript

İş başlamadan önce çalıştırılacak komutları belirtir. Betik bloğu oluşturmak için komutları küme ayraçları ({}) içine alın.

İşin çalıştığı oturumu hazırlamak için bu parametreyi kullanın. Örneğin, oturuma işlevler ve modüller eklemek için kullanabilirsiniz.

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

-InputObject

Betik bloğuna giriş olarak kullanılan nesneleri belirtir. İşlem hattı girişlerine de izin verir. Giriş nesnelerine $input erişmek için betik bloğundaki otomatik değişkeni kullanın.

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

-Name

Yeni iş için kolay bir ad belirtir. cmdlet'i gibi Stop-Job diğer iş cmdlet'lerine işi tanımlamak için bu adı kullanabilirsiniz.

Varsayılan kolay ad "İş#"tir; burada "#" her iş için artırılan bir sıra numarasıdır.

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

-ScriptBlock

Arka plan işinde çalıştırılacak komutları belirtir. Betik bloğu oluşturmak için komutları küme ayraçları ({}) içine alın. $Input InputObject parametresinin değerine erişmek için otomatik değişkenini kullanın. Bu parametre zorunludur.

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

-StreamingHost

Bu parametre, çıkışın doğrudan geçirilen PSHost nesnesine gitmesine izin vermek Write-Host için iş parçacığı güvenli bir yol sağlar. Bu olmadan, Write-Host çıkış iş bilgileri veri akışı koleksiyonuna gider ve işlerin çalışması bitene kadar konak konsolunda görünmez.

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

-ThrottleLimit

Bu parametre, bir kerede çalışan iş sayısını sınırlar. İşler başlatılırken kuyruğa alınırlar ve iş parçacığı havuzunda işi çalıştırmak için bir iş parçacığı kullanılabilir olana kadar beklerler. Varsayılan sınır 5 iş parçacığıdır.

İş parçacığı havuzu boyutu PowerShell oturumu için geneldir. Bir çağrıda ThrottleLimit belirtilmesi, aynı oturumdaki sonraki çağrıların sınırını ayarlar.

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

Girişler

PSObject

Çıkışlar

ThreadJob.ThreadJob