Start-ThreadJob

Membuat pekerjaan latar belakang yang mirip Start-Job dengan cmdlet.

Sintaks

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>]

Deskripsi

Start-ThreadJob membuat pekerjaan latar belakang yang mirip Start-Job dengan cmdlet. Perbedaan utamanya adalah bahwa pekerjaan yang dibuat berjalan di utas terpisah dalam proses lokal. Secara default, pekerjaan menggunakan direktori kerja pemanggil saat ini yang memulai pekerjaan.

Cmdlet juga mendukung parameter ThrottleLimit untuk membatasi jumlah pekerjaan yang berjalan sekaligus. Ketika lebih banyak pekerjaan dimulai, mereka diantrekan dan menunggu sampai jumlah pekerjaan saat ini turun di bawah batas pembatasan.

Contoh

Contoh 1 - Membuat pekerjaan latar belakang dengan batas utas 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;...

Contoh 2 - Bandingkan performa Start-Job dan Start-ThreadJob

Contoh ini menunjukkan perbedaan antara Start-Job dan Start-ThreadJob. Pekerjaan menjalankan Start-Sleep cmdlet selama 1 detik. Karena pekerjaan berjalan secara paralel, total waktu eksekusi adalah sekitar 1 detik, ditambah kapan saja diperlukan untuk membuat pekerjaan.

# 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

Setelah mengurangi 1 detik untuk waktu eksekusi, Anda dapat melihat bahwa Start-Job membutuhkan waktu sekitar 4,8 detik untuk membuat lima pekerjaan. Start-ThreadJob adalah 8 kali lebih cepat, membutuhkan waktu sekitar 0,6 detik untuk membuat lima pekerjaan. Hasilnya dapat bervariasi di lingkungan Anda tetapi peningkatan relatifnya harus sama.

Contoh 3 - Membuat pekerjaan menggunakan InputObject

Dalam contoh ini, blok skrip menggunakan $input variabel untuk menerima input dari parameter InputObject . Ini juga dapat dilakukan dengan mempipa objek ke 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

Contoh 4 - Mengalirkan output pekerjaan ke host induk

Menggunakan parameter StreamingHost, Anda dapat memberi tahu pekerjaan untuk mengarahkan semua output host ke host tertentu. Tanpa parameter ini, output masuk ke pengumpulan aliran data pekerjaan dan tidak muncul di konsol host hingga Anda menerima output dari pekerjaan.

Untuk contoh ini, host saat ini diteruskan ke Start-ThreadJob menggunakan $Host variabel otomatis.

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>

Perhatikan bahwa perintah dari Read-Host ditampilkan dan Anda dapat mengetik input. Kemudian, pesan dari Write-Warning ditampilkan. Receive-Job Cmdlet mengembalikan semua output dari pekerjaan.

Contoh 5 - Mengunduh beberapa file secara bersamaan

Invoke-WebRequest Cmdlet hanya dapat mengunduh satu file pada satu waktu. Contoh berikut menggunakan Start-ThreadJob untuk membuat beberapa pekerjaan utas untuk mengunduh beberapa file secara bersamaan.

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

Parameter

-ArgumentList

Menentukan array argumen, atau nilai parameter, untuk skrip yang ditentukan oleh parameter FilePath atau ScriptBlock .

ArgumentList harus menjadi parameter terakhir pada baris perintah. Semua nilai yang mengikuti nama parameter ditafsirkan nilai dalam daftar argumen.

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

-FilePath

Menentukan file skrip untuk dijalankan sebagai pekerjaan latar belakang. Masukkan jalur dan nama file skrip. Skrip harus berada di komputer lokal atau dalam folder yang dapat diakses komputer lokal.

Saat Anda menggunakan parameter ini, PowerShell mengonversi konten file skrip yang ditentukan ke blok skrip dan menjalankan blok skrip sebagai pekerjaan latar belakang.

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

-InitializationScript

Menentukan perintah yang berjalan sebelum pekerjaan dimulai. Sertakan perintah dalam kurung kurawal ({}) untuk membuat blok skrip.

Gunakan parameter ini untuk menyiapkan sesi tempat pekerjaan berjalan. Misalnya, Anda dapat menggunakannya untuk menambahkan fungsi dan modul ke sesi.

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

-InputObject

Menentukan objek yang digunakan sebagai input ke blok skrip. Ini juga memungkinkan input alur. $input Gunakan variabel otomatis di blok skrip untuk mengakses objek input.

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

-Name

Menentukan nama yang mudah diingat untuk pekerjaan baru. Anda dapat menggunakan nama untuk mengidentifikasi pekerjaan ke cmdlet pekerjaan lain, seperti Stop-Job cmdlet.

Nama ramah default adalah "Job#", di mana "#" adalah angka ordinal yang bertahap untuk setiap pekerjaan.

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

-ScriptBlock

Menentukan perintah yang akan dijalankan di pekerjaan latar belakang. Sertakan perintah dalam kurung kurawal ({}) untuk membuat blok skrip. $Input Gunakan variabel otomatis untuk mengakses nilai parameter InputObject. Parameter ini diperlukan.

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

-StreamingHost

Parameter ini menyediakan cara aman utas untuk memungkinkan Write-Host output langsung masuk ke objek PSHost yang diteruskan. Tanpa itu, Write-Host output masuk ke pengumpulan aliran data informasi pekerjaan dan tidak muncul di konsol host sampai setelah pekerjaan selesai berjalan.

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

-ThrottleLimit

Parameter ini membatasi jumlah pekerjaan yang berjalan pada satu waktu. Saat pekerjaan dimulai, mereka diantrekan dan menunggu hingga utas tersedia di kumpulan utas untuk menjalankan pekerjaan. Batas defaultnya adalah 5 utas.

Ukuran kumpulan utas bersifat global untuk sesi PowerShell. Menentukan ThrottleLimit dalam satu panggilan menetapkan batas untuk panggilan berikutnya dalam sesi yang sama.

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

Input

PSObject

Output

ThreadJob.ThreadJob