Bagikan melalui


Start-ThreadJob

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

Sintaks

ScriptBlock

Start-ThreadJob
    [-ScriptBlock] <ScriptBlock>
    [-Name <String>]
    [-InitializationScript <ScriptBlock>]
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-ThrottleLimit <Int32>]
    [-StreamingHost <PSHost>]
    [<CommonParameters>]

FilePath

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 dengan cmdlet Start-Job. 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 - Membandingkan performa Start-Job dan Start-ThreadJob

Contoh ini menunjukkan perbedaan antara Start-Job dan Start-ThreadJob. Pekerjaan menjalankan cmdlet Start-Sleep 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 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 variabel otomatis $Host.

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. Cmdlet Receive-Job 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.

Properti parameter

Jenis:

Object[]

Nilai default:None
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

(All)
Position:Named
Wajib:False
Nilai dari alur:False
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa: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 blokir skrip sebagai pekerjaan latar belakang.

Properti parameter

Jenis:String
Nilai default:None
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

FilePath
Position:0
Wajib:True
Nilai dari alur:False
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa:False

-InitializationScript

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

Gunakan parameter ini untuk menyiapkan sesi di mana pekerjaan akan dijalankan. Misalnya, Anda dapat menggunakannya untuk menambahkan fungsi dan modul ke sesi.

Properti parameter

Jenis:ScriptBlock
Nilai default:None
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

(All)
Position:Named
Wajib:False
Nilai dari alur:False
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa:False

-InputObject

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

Properti parameter

Jenis:PSObject
Nilai default:None
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

(All)
Position:Named
Wajib:False
Nilai dari alur:True
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa:False

-Name

Menentukan nama yang ramah untuk pekerjaan baru. Anda dapat menggunakan nama untuk mengidentifikasi tugas ke cmdlet tugas lainnya, seperti cmdlet Stop-Job.

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

Properti parameter

Jenis:String
Nilai default:None
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

(All)
Position:Named
Wajib:False
Nilai dari alur:False
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa:False

-ScriptBlock

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

Properti parameter

Jenis:ScriptBlock
Nilai default:None
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

ScriptBlock
Position:0
Wajib:True
Nilai dari alur:False
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa:False

-StreamingHost

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

Properti parameter

Jenis:PSHost
Nilai default:None
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

(All)
Position:Named
Wajib:False
Nilai dari alur:False
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa: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.

Properti parameter

Jenis:Int32
Nilai default:5
Mendukung wildcard:False
DontShow:False

Kumpulan parameter

(All)
Position:Named
Wajib:False
Nilai dari alur:False
Nilai dari alur berdasarkan nama properti:False
Nilai dari argumen yang tersisa:False

CommonParameters

Cmdlet ini mendukung parameter umum: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction, dan -WarningVariable. Untuk informasi selengkapnya, lihat about_CommonParameters.

Input

PSObject

Output

ThreadJob.ThreadJob