Saya memiliki skrip PowerShell untuk melakukan pemrosesan batch pada sekumpulan gambar dan saya ingin melakukan pemrosesan paralel. Powershell tampaknya memiliki beberapa opsi pemrosesan latar belakang seperti start-job, wait-job, dll, tetapi satu-satunya sumber daya bagus yang saya temukan untuk melakukan pekerjaan paralel adalah menulis teks skrip dan menjalankannya ( PowerShell Multithreading )
Idealnya, saya ingin sesuatu yang mirip dengan parallel foreach di .net 4.
Sesuatu yang sangat tidak terlihat seperti:
foreach-parallel -threads 4 ($file in (Get-ChildItem $dir))
{
.. Do Work
}
Mungkin lebih baik aku turun ke c # ...
multithreading
powershell
parallel-processing
Alan Jackson
sumber
sumber
receive-job (wait-job ($a = start-job { "heyo!" })); remove-job $a
atau$a = start-job { "heyo!" }; wait-job $a; receive-job $a; remove-job $a
Perhatikan juga bahwa jika Anda meneleponreceive-job
sebelum pekerjaan selesai, Anda mungkin tidak mendapatkan apa-apa.(get-job $a).jobstateinfo.state;
Jawaban:
Anda dapat menjalankan pekerjaan paralel di Powershell 2 menggunakan Pekerjaan Latar Belakang . Lihat Start-Job dan cmdlet pekerjaan lainnya.
sumber
Test-Path "\\$_\c$\Something"
Saya mengharapkannya untuk diperluas$_
ke item saat ini. Namun, ternyata tidak. Sebaliknya itu mengembalikan nilai kosong. Ini sepertinya hanya terjadi dari dalam blok skrip. Jika saya menulis nilai itu segera setelah komentar pertama, tampaknya berfungsi dengan benar.Jawaban dari Steve Townsend benar secara teori tetapi tidak dalam praktek seperti yang dikatakan @likwid. Kode revisi saya memperhitungkan penghalang konteks pekerjaan --tidak ada yang melewati penghalang itu secara default!
$_
Variabel otomatis dengan demikian dapat digunakan dalam loop tetapi tidak dapat digunakan secara langsung di dalam blok skrip karena berada di dalam konteks terpisah yang dibuat oleh pekerjaan.Untuk meneruskan variabel dari konteks induk ke konteks anak, gunakan
-ArgumentList
parameter padaStart-Job
untuk mengirimnya dan gunakanparam
di dalam blok skrip untuk menerimanya.(Saya biasanya suka memberikan referensi ke dokumentasi PowerShell sebagai bukti pendukung tetapi, sayangnya, pencarian saya tidak membuahkan hasil. Jika Anda kebetulan mengetahui di mana pemisahan konteks didokumentasikan, kirim komentar di sini untuk memberi tahu saya!)
sumber
Start-Job -FilePath script.ps1 -ArgumentList $_
http://gallery.technet.microsoft.com/scriptcenter/Invoke-Async-Allows-you-to-83b0c9f0
saya membuat invoke-async yang memungkinkan Anda menjalankan beberapa blok skrip / cmdlet / fungsi pada saat yang bersamaan. ini bagus untuk pekerjaan kecil (pemindaian subnet atau kueri wmi terhadap 100-an mesin) karena overhead untuk membuat runspace vs waktu startup dari pekerjaan mulai cukup drastis. Itu bisa digunakan seperti itu.
dengan scriptblock,
hanya cmdlet / function
sumber
Ada begitu banyak jawaban untuk saat ini:
foreach-object -parallel
alternatif untuk # 4Berikut alur kerja dengan foreach -parallel:
Atau alur kerja dengan blok paralel:
Berikut adalah contoh api dengan runspaces:
sumber
Pekerjaan latar belakang mahal untuk disiapkan dan tidak dapat digunakan kembali. PowerShell MVP Oisin Grehan memiliki contoh PowerShell multi-threading yang bagus.
(10/25/2010 situs sedang down, tetapi dapat diakses melalui Arsip Web).
Saya menggunakan skrip Oisin yang diadaptasi untuk digunakan dalam rutinitas pemuatan data di sini:
http://rsdd.codeplex.com/SourceControl/changeset/view/a6cd657ea2be#Invoke-RSDDThreaded.ps1
sumber
Untuk menyelesaikan jawaban sebelumnya, Anda juga dapat menggunakan
Wait-Job
untuk menunggu semua pekerjaan selesai:sumber
Di Powershell 7 Anda dapat menggunakan ForEach -Object -Parallel
sumber
Jika Anda menggunakan PowerShell lintas platform terbaru (yang seharusnya Anda btw) https://github.com/powershell/powershell#get-powershell , Anda dapat menambahkan single
&
untuk menjalankan skrip paralel. (Menggunakan;
untuk menjalankan secara berurutan)Dalam kasus saya, saya perlu menjalankan skrip 2 npm secara paralel:
npm run hotReload & npm run dev
Anda juga dapat mengatur npm untuk digunakan
powershell
untuk skripnya (secara default digunakancmd
di windows).Jalankan dari folder root proyek:
npm config set script-shell pwsh --userconfig ./.npmrc
lalu gunakan perintah skrip npm tunggal:npm run start
sumber