繁体   English   中英

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

[英]How is the new PowerShell 7 ForEach-Object Parallel implemented?

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

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

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

我真的很感激对以下方面的一些技术见解:

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

调试 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM