ThreadJob'u Başlat (ThreadJob)


Start-ThreadJob

Modül:
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>]

Tanım

Start-ThreadJob, Start-Job cmdlet'ine benzer arka plan işleri oluşturur. Temel fark, oluşturulan işlerin yerel süreç içerisinde ayrı iş parçacıklarında çalıştırılmasıdır. Varsayılan olarak işler, işi başlatan arayanın geçerli çalışma dizinini kullanır.

Cmdlet aynı anda çalışan işlerin sayısını sınırlamak için ThrottleLimit parametresini de destekler. Daha fazla iş başlatıldıkça bunlar sıraya alınır ve mevcut iş sayısı kısıtlama sınırının altına düşene kadar beklenir.

Ö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'un performansını karşılaştırın

Bu örnek, Start-Job ile Start-ThreadJob arasındaki farkı gösterir. İşler Başlat-Uyku cmdlet'ini 1 saniye boyunca çalıştırır. İşler paralel çalıştığından, toplam yürütme süresi yaklaşık 1 saniye artı 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 çıkarıldıktan sonra, Start-Job'un beş iş oluşturmasını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ıza göre değişebilir ancak göreceli iyileşme aynı olmalıdır.

Örnek 3 - OutputObject'i kullanarak iş oluşturma

Bu örnekte komut dosyası bloğu, InputObject parametresinden girdi almak için $input değişkenini kullanır. Bu aynı zamanda nesneleri Start-ThreadJob'a aktararak 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 - İş çıktısını ana ana bilgisayara aktarın

StreamingHost parametresini kullanarak bir işe tüm ana bilgisayar çıktısını belirli bir ana makineye yönlendirmesini söyleyebilirsiniz. Bu parametre olmadan çıktı, iş veri akışı koleksiyonuna gider ve işten çıktıyı alana kadar ana bilgisayar konsolunda görünmez.

Bu örnekte, geçerli ana bilgisayar, $Host otomatik değişkeni kullanılarak Start-ThreadJob'a aktarılır.

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şi yazabildiğinize dikkat edin. Daha sonra Write-Warning mesajı görüntülenir. Receive-Job cmdlet'i işin tüm çıktısını döndürür.

Örnek 5 - Aynı anda birden fazla dosya indirin

Invoke-WebRequest cmdlet'i aynı anda yalnızca bir dosya indirebilir. Aşağıdaki örnek, aynı anda birden çok dosyayı indirmek üzere birden çok iş parçacığı işi oluşturmak için Start-ThreadJob'u 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 komut dosyası 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ından sonra gelen tüm değerler, bağımsız değişken listesindeki yorumlanmış değerlerdir.

Tip :

Object[]

Konum:

Adlandırılmış

Varsayılan değer:

None

Gerekli:

False

Boru hattı girişini kabul edin:

False

Joker karakterleri kabul et:

False

-FilePath

Arka plan işi olarak çalıştırılacak bir komut dosyası dosyasını belirtir. Komut dosyasının yolunu ve dosya adını girin. Komut dosyası 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 bir arka plan işi olarak çalıştırır.

Tip :

String

Konum:

0

Varsayılan değer:

None

Gerekli:

True

Boru hattı girişini kabul edin:

False

Joker karakterleri kabul et:

False

-InitializationScript

İş başlamadan önce çalıştırılacak komutları belirtir. Bir komut dosyası bloğu oluşturmak için komutları parantez ({comcode>) 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 bunu kullanabilirsiniz.

Tip :

ScriptBlock

Konum:

Adlandırılmış

Varsayılan değer:

None

Gerekli:

False

Boru hattı girişini kabul edin:

False

Joker karakterleri kabul et:

False

-InputObject

Betik bloğuna girdi olarak kullanılan nesneleri belirtir. Aynı zamanda boru hattı girişine de izin verir. Giriş nesnelerine erişmek için komut dosyası bloğundaki $input otomatik değişkenini kullanın.

Tip :

PSObject

Konum:

Adlandırılmış

Varsayılan değer:

None

Gerekli:

False

Boru hattı girişini kabul edin:

True

Joker karakterleri kabul et:

False

-Name

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

Varsayılan kolay ad "İş#" olup, burada "#" her iş için artan bir sıra numarasıdır.

Tip :

String

Konum:

Adlandırılmış

Varsayılan değer:

None

Gerekli:

False

Boru hattı girişini kabul edin:

False

Joker karakterleri kabul et:

False

-ScriptBlock

Arka plan işinde çalıştırılacak komutları belirtir. Bir komut dosyası bloğu oluşturmak için komutları parantez ({comcode>) içine alın. InputObject parametresinin değerine erişmek için $Input otomatik değişkenini kullanın. Bu parametre gereklidir.

Tip :

ScriptBlock

Konum:

0

Varsayılan değer:

None

Gerekli:

True

Boru hattı girişini kabul edin:

False

Joker karakterleri kabul et:

False

-StreamingHost

Bu parametre, Write-Host çıktısının doğrudan PSHost nesnesinde iletilen nesneye gitmesine izin vermek için iş parçacığı açısından 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 ana bilgisayar konsolunda görünmez.

Tip :

PSHost

Konum:

Adlandırılmış

Varsayılan değer:

None

Gerekli:

False

Boru hattı girişini kabul edin:

False

Joker karakterleri kabul et:

False

-ThrottleLimit

Bu parametre aynı anda çalışan işlerin sayısını sınırlar. İşler başlatıldığında kuyruğa alınırlar ve işi çalıştırmak için iş parçacığı havuzunda bir iş parçacığı bulunana 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 için sınırı belirler.

Tip :

Int32

Konum:

Adlandırılmış

Varsayılan değer:

5

Gerekli:

False

Boru hattı girişini kabul edin:

False

Joker karakterleri kabul et:

False

Girişler

PSObject

Çıkışlar

ThreadJob.ThreadJob

İlgili makaleler