![](/img/trans.png)
[英]Powershell: How to add Result to an Array (ForEach-Object -Parallel)
[英]How is the new PowerShell 7 ForEach-Object Parallel implemented?
PowerShell 7 引入了一个非常需要的功能来并行运行管道输入。
PowerShell 7的文档没有提供有关如何实现的任何详细信息。
之前利用过PoshRSJob
和Invoke-Parallel
模块,我知道运行空间传统上被认为是在 powershell 中进行并行操作比运行 PowerShell 作业更有效的方法。 我已经阅读了一些混合内容,表明这是现在使用线程而不是运行空间,但找不到任何其他特定内容。
我真的很感激对以下方面的一些技术见解:
调试 foreach-object -parallel:
我需要第二个 pwsh 进程来做到这一点。 在第一个做:
foreach-object -parallel { Wait-Debugger;1;2;3 }
然后在第二个窗口中,找出另一个 pwsh 的 pid 是什么。 然后输入那个 pshostprocess。 查看运行空间,并调试可用性显示为“InBreakpoint”的运行空间。 “v”的意思是“跨过”。
get-process pwsh
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
64 44.32 82.23 1.70 3912 12 pwsh
63 40.66 78.03 1.36 6472 12 pwsh
$pid
6472
Enter-PSHostProcess 3912
get-runspace
Id Name ComputerName Type State Availability
-- ---- ------------ ---- ----- ------------
1 Runspace1 localhost Local Opened Busy
2 PSTask:1 localhost Local Opened InBreakpoint
3 RemoteHost localhost Local Opened Busy
debug-runspace 2
v
v
v
如果运行 foreach-object -parallel -asjob,则可以在同一窗口中使用 get-runspace 和 debug-runspace。 但是步进时看不到输出。
foreach-object -parallel { Wait-Debugger;1;2;3 } -asjob
get-runspace
Id Name ComputerName Type State Availability
-- ---- ------------ ---- ----- ------------
1 Runspace1 localhost Local Opened Available
2 PSTask:1 localhost Local Opened InBreakpoint
debug-runspace 2
v
v
v
这是一个新的调试视频,其中包含一些使用 Vscode 的高级设置: https ://www.reddit.com/r/PowerShell/comments/gn0270/advanced_powershell_debugging_techniques/
找到了 Paul Higinbotham 撰写的这篇精彩的博客文章PowerShell ForEach-Object Parallel Feature 。
从这篇博文中,我总结了一些关键亮点:
脚本块在称为 PowerShell 运行空间的上下文中运行。 运行空间上下文包含所有定义的变量、函数和加载的模块。
如前所述,新的 ForEach-Object -Parallel 功能使用现有的 PowerShell 功能来并发运行脚本块……PowerShell 本身根据其设计和历史对脚本如何并发运行施加了条件。 脚本必须在运行空间上下文中运行,并且在一个运行空间中一次只能运行一个脚本线程。 因此,为了同时运行多个脚本,必须创建多个运行空间。
因此,它确认运行空间是此操作的主要驱动因素,并提供有关线程安全操作等的更多信息。 任何先前提供的关于运行空间的答案或细节在这里都是相关的,因为这是官方标准库中并行操作的运行空间的成熟实现。 社区已经完成了面向运行空间的其他实现,但现在包含在没有外部模块依赖项的情况下。
感谢Paul为社区做出如此出色的贡献! 👍
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.