首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新的PowerShell 7 ForEach对象并行是如何实现的?

新的PowerShell 7 ForEach对象并行是如何实现的?
EN

Stack Overflow用户
提问于 2020-03-24 19:13:43
回答 2查看 2.6K关注 0票数 5

PowerShell 7为并行运行管道输入引入了一个非常需要的特性。

PowerShell 7的文档没有提供关于如何实现这一点的任何细节。

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

我非常希望能对以下问题有一些技术见解:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-08 19:27:09

找到了这个奇妙的博客文章PowerShell ForEach对象并行特性由保罗希金波坦。

在这篇博客文章中,我删除了一些重要的亮点:

脚本块在称为PowerShell运行空间的上下文中运行。运行空间上下文包含所有定义的变量、函数和加载的模块。 如前所述,新的ForEach对象-Parallel特性使用现有的PowerShell功能来运行脚本块,concurrently....PowerShell本身根据脚本的设计和历史对脚本如何并发运行施加了条件。脚本必须在运行空间上下文中运行,并且每次只能在运行空间中运行一个脚本线程。因此,为了同时运行多个脚本,必须创建多个运行空间。

因此,它确认运行空间是这方面的主要驱动程序,并提供了一些关于threadsafe操作的更多信息。在运行空间中提供的任何先前的答案或细节在这里都是相关的,因为这是一个成熟的运行空间实现,用于官方标准库中的并行操作。其他实现是由面向运行空间的社区完成的,但现在没有外部模块依赖。

感谢保罗为社区做出的如此好的贡献!

票数 1
EN

Stack Overflow用户

发布于 2020-05-20 02:32:37

调试foreach-对象-parallel:

我需要第二个pwsh进程来完成它。在第一种情况下:

代码语言:javascript
复制
foreach-object -parallel { Wait-Debugger;1;2;3 }

然后在第二个窗口中,找出其他pwsh的pid是什么。然后输入那个pshostprocess。查看运行空间,并调试可用性为"InBreakpoint“的运行空间。"v“的意思是”跳过去“。

代码语言:javascript
复制
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和调试-runspace。但您在步进时看不到输出。

代码语言:javascript
复制
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的高级设置的新调试视频:技术/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60837777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档