PowerShell 7: Foreach-Object -Parallel
ด้วย PowerShell 7 มีการแนะนำคุณสมบัติใหม่: Foreach-Object -Parallel คุณลักษณะแบบขนานจะเร่งความเร็วลูปใน PowerShell ในบล็อกโพสต์นี้ ฉันจะเปรียบเทียบเทคนิคเก่ากับเทคนิคใหม่ และฉันมั่นใจว่าผู้อ่านจะต้องประหลาดใจอย่างแน่นอน กระโดดเข้าไปเลย
สมมติว่าคุณมีสคริปต์ที่มีการวนซ้ำและสคริปต์นี้ใช้เวลานานในการทำให้เสร็จสมบูรณ์ คุณต้องการให้สคริปต์ของคุณทำงานเร็วขึ้น แต่คุณพบว่าปัจจุบันนี้ไม่มีวิธีที่ง่ายในการทำเช่นนั้น
ถึงเวลาเปลี่ยนเป็น PowerShell 7 เนื่องจาก Foreach-Object -Parallel เปิดเธรดแบบขนานและวนซ้ำแต่ละรายการในลูปแบบขนาน นั่นจะช่วยเร่งรันไทม์ของลูปได้อย่างมาก
Foreach-Object -Parallel คืออะไร
Foreach-Object -Parallel ให้การประมวลผลออบเจ็กต์อินพุตแบบขนาน PowerShell จะประมวลผลออบเจ็กต์อินพุตครั้งละ 5 รายการเท่านั้น ขีดจำกัดนี้สามารถเพิ่มได้ด้วยพารามิเตอร์ -ThrottleLimit
ตัวอย่าง :
$test = 'sid-500.com','orf.at','8.8.8.8','cnn.com'
$test | ForEach-Object -Parallel {Test-Connection -TargetName $_}
ตอนนี้เรามาดูกันว่ามีประโยชน์มากแค่ไหน
เปรียบเทียบ foreach | Foreach-วัตถุ | Foreach-วัตถุ-ขนาน
ฉันได้เตรียมตัวอย่างเพื่อความเข้าใจที่ดีขึ้น ฉันจะสแกนพอร์ตเพื่อทดสอบว่าพอร์ตเปิดอยู่หรือไม่ นอกจากนี้ ฉันใช้ Measure-Command เพื่อวัดว่าโค้ดจะทำงานนานแค่ไหน มีวัตถุประสงค์เพื่อเปรียบเทียบเทคนิคเก่ากับเทคนิคใหม่
แต่ละ()
รหัสแรกจะทดสอบโฮสต์ 192.0.78.24 (sid-500.com) ด้วย foreach() หมายเลขพอร์ตที่ทดสอบคือ 443 (HTTPS), 80 (HTTP), 53 (DNS) และ 88 (Kerberos)
Measure-Command {
$port = '443','80','53','88'
foreach ($p in $port) {
Test-NetConnection -ComputerName 192.0.78.24 -Port $p -WarningAction Ignore
}} | Select-Object Minutes,Seconds
นี่คือผลลัพธ์:
โอเค ใช้เวลาประมาณ 1 นาที 18 วินาที อย่างไรก็ตาม รหัสทั้งหมดถูกดำเนินการใน Visual Studio Code ซึ่งในขณะนั้นเป็นตัวแก้ไขเริ่มต้นของ PowerShell 7
Foreach-วัตถุ
ต่อไป ฉันจะลองใช้ Foreach-Object โดยไม่มีการประมวลผลแบบขนาน
Measure-Command {
$port = '443','80','53','88'
$port |
ForEach-Object {Test-NetConnection -ComputerName 192.0.78.24 -Port $_ -WarningAction Ignore}
} | Select-Object Minutes,Seconds
เหมือนกันที่นี่
ซึ่งนำฉันไปสู่คุณสมบัติใหม่
Foreach-วัตถุ-ขนาน
ก่อนอื่น ตามที่กล่าวไว้ในตอนต้น โปรดจำไว้ว่า Foreach-Object -Parallel ถูกจำกัดไว้ที่ 5 บล็อกสคริปต์ในแต่ละครั้ง การตั้งค่านี้สามารถเพิ่มได้ด้วยพารามิเตอร์ -ThrottleLimit ไม่มีปัญหา ฉันจะใช้วัตถุประมวลผลแบบขนานเพียง 4 ชิ้นเท่านั้น
มันจะได้เปรียบความเร็วอะไร? นี่คือในการดำเนินการ
Measure-Command {
$port = '443','80','53','88'
$port |
ForEach-Object -Parallel {Test-NetConnection -ComputerName 192.0.78.24 -Port $_ -WarningAction Ignore}
} | Select-Object Minutes,Seconds
เร็วกว่าสองเท่า! มหัศจรรย์!
ข้อมูลเพิ่มเติมเกี่ยวกับคุณลักษณะแบบขนานใหม่ที่นี่: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-7
ขอให้สนุกกับการเร่งความเร็วสคริปต์ของคุณด้วย PowerShell 7 และ Foreach-Object -Parallel


