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.
Jenis: | Object[] |
Position: | Named |
Nilai default: | None |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | 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.
Jenis: | String |
Position: | 0 |
Nilai default: | None |
Diperlukan: | True |
Terima input alur: | False |
Terima karakter wildcard: | 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.
Jenis: | ScriptBlock |
Position: | Named |
Nilai default: | None |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | 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.
Jenis: | PSObject |
Position: | Named |
Nilai default: | None |
Diperlukan: | False |
Terima input alur: | True |
Terima karakter wildcard: | 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.
Jenis: | String |
Position: | Named |
Nilai default: | None |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | 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.
Jenis: | ScriptBlock |
Position: | 0 |
Nilai default: | None |
Diperlukan: | True |
Terima input alur: | False |
Terima karakter wildcard: | 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.
Jenis: | PSHost |
Position: | Named |
Nilai default: | None |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | 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.
Jenis: | Int32 |
Position: | Named |
Nilai default: | 5 |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
Input
Output
ThreadJob.ThreadJob