Aracılığıyla paylaş


Start-ThreadJob

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

Sözdizimi

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, Start-Job cmdlet'ine 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 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 örnek, Start-Job ile Start-ThreadJobarasındaki farkı gösterir. İşler, Start-Sleep cmdlet'ini 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 Start-Job beş iş oluşturmanın yaklaşık 4,8 saniye sürdüğünü 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 $input değişkenini kullanır. Bu, nesneleri 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 konak $Host otomatik değişkeni kullanılarak 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>

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

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

Invoke-WebRequest cmdlet'i 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 Start-ThreadJob kullanır.

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

Tür:Object[]
Position:Named
Default value:None
Gerekli:False
İşlem hattı girişini kabul et:False
Joker karakterleri kabul et: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.

Tür:String
Position:0
Default value:None
Gerekli:True
İşlem hattı girişini kabul et:False
Joker karakterleri kabul et:False

-InitializationScript

İş başlamadan önce çalıştırılacak komutları belirtir. Komut dosyası 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.

Tür:ScriptBlock
Position:Named
Default value:None
Gerekli:False
İşlem hattı girişini kabul et:False
Joker karakterleri kabul et:False

-InputObject

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

Tür:PSObject
Position:Named
Default value:None
Gerekli:False
İşlem hattı girişini kabul et:True
Joker karakterleri kabul et:False

-Name

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

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

Tür:String
Position:Named
Default value:None
Gerekli:False
İşlem hattı girişini kabul et:False
Joker karakterleri kabul et:False

-ScriptBlock

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

Tür:ScriptBlock
Position:0
Default value:None
Gerekli:True
İşlem hattı girişini kabul et:False
Joker karakterleri kabul et:False

-StreamingHost

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

Tür:PSHost
Position:Named
Default value:None
Gerekli:False
İşlem hattı girişini kabul et:False
Joker karakterleri kabul et: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.

Tür:Int32
Position:Named
Default value:5
Gerekli:False
İşlem hattı girişini kabul et:False
Joker karakterleri kabul et:False

Girişler

PSObject

Çıkışlar

ThreadJob.ThreadJob