PowerShell 7: ForEach-Object -parallel ile paralel çalışma

Womanne

Member
PowerShell 7.0’dan beri parametreyi kullanabilirsiniz. -parallel farklı iş parçacıklarında yürütülen döngünün yürütülmesini paralel hale getirin (çoklu iş parçacığı ile).


Bu blog dizisinin ilk bölümünde PowerShell 7.0’ın teknik temeline baktım, ikinci bölümde PowerShell Core 6.x ve Windows PowerShell 5.1 ile karşılaştırıldığında PowerShell 7.0’ın mevcut özellik setini ölçtüm. Şimdi yeni bireysel fonksiyonları tanıtmaya başlamak istiyorum. Bu güçlü yeni parametredir -parallel tanıdık komut uygulamasında Foreach-Object.

PowerShell 1.0’dan 6.2’ye kadar, Foreach-Object ana PowerShell iş parçacığında, yani bireysel yürütmeler birbiri ardına yürütülür. PowerShell 7.0’dan beri parametreyi kullanabilirsiniz. -parallel farklı iş parçacıklarında yürütmeyi paralelleştirin (çoklu iş parçacığı yoluyla), böylece sonuç daha uzun işlemler için genel olarak daha hızlı kullanılabilir.

Çoklu iş parçacığı her zaman ek yüke sahiptir. Paralelleştirme yalnızca daha uzun işlemler için kullanışlıdır. Kısa işlemler için, iş parçacığı oluşturma ve yok etmede kaybedilen zaman, paralelleştirme ile kazanılan süreden daha fazladır.

Aşağıdaki örnek, “Klasik Kabuk” yazılımı üç farklı bilgisayara kuruluysa, sorgunun iki çeşidini gösterir. Olmayan ilk varyantta -parallel biraz sıkıcı WMI sınıfı sorgusu olur Win32_Product üç bilgisayarda aynı iş parçacığında sırayla yürütülür. ile ikinci varyantta -parallel sorgu paralel olarak üç farklı iş parçacığında başlatılır; sonuçlar ancak tüm istekler gönderildikten sonra gelir (aşağıdaki şekle bakın). Yürütmenin aslında farklı iş parçacıklarında gerçekleştiği, dosyayı sorgulayarak gösterilir. ManagedThreadId .NET Thread sınıfındaki geçerli thread’de: [System.Threading.Thread]::CurrentThread.ManagedThreadId.

Write-Host "# ForEach-Object ohne -parallel" -ForegroundColor Yellow
"E27","E29","E44" | ForEach-Object {
"Abfrage bei Computer $_ in Thread $([System.Threading.Thread]::CurrentThread.ManagedThreadId)"
$e = Get-CimInstance -Class Win32_Product -Filter "Name='Classic Shell'" -computername $_
if ($e -eq $null) { "Kein Ergebnis bei $_!"}
else { $e }
}
Write-host ""
Write-host " # ForEach-Object mit -parallel" -ForegroundColor Yellow
"E27","E29","E44" | ForEach-Object -parallel {
"Abfrage bei Computer $_ in Thread $([System.Threading.Thread]::CurrentThread.ManagedThreadId)"
$e = Get-CimInstance -Class Win32_Product -Filter "Name='Classic Shell'" -computername $_
if ($e -eq $null) { "Kein Ergebnis bei $_!"}
else { $e }
}
# ohne Read-Host würde das Skript die später eingehenden Ergebnisse nicht mehr anzeigen!
read-host




PowerShell 7'de Foreach-Object ile Eşzamanlılık



PowerShell 7’de Foreach-Object ile Eşzamanlılık



İplik sayısı Foreach-Object parametresi ile kullanılabilir. -ThrottleLimit sınır:


1..20 | ForEach-Object -parallel {
Write-host "Objekt #$_ in Thread $([System.Threading.Thread]::CurrentThread.ManagedThreadId)"
sleep -Seconds 2 } -ThrottleLimit 5



()





Haberin Sonu
 
Üst