新的PowerShell 7 ForEach Object Parallel是如何实现的



PowerShell 7引入了一个非常需要的功能,用于并行运行管道输入。

PowerShell 7的文档没有提供有关如何实现此功能的任何详细信息。

以前使用过PoshRSJobInvoke-Parallel模块,我知道运行空间传统上被认为是在powershell中进行并行操作的更有效的方法,而不是运行powershell作业。我读过一些混合内容,表明现在使用线程而不是运行空间,但找不到其他特定内容。

我真的很感激对的一些技术见解

  1. 从.NET的角度来看,执行的生命周期是什么
  2. 新功能是运行空间还是线程(或者运行空间只是System.Management.Automation中的.NET线程?(
  3. 现在我们进入并行操作,这会给传统调试带来复杂性吗从历史上看,我在调试运行空间时遇到了困难,不确定哪些选项可能得到了改进

调试foreach对象-并行:

我需要第二个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运行空间和debug运行空间。但是在跨步时看不到输出。

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对社区的贡献!👍

最新更新