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

She*_*onH 5 powershell runspace powershell-core

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

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

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

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

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

She*_*onH 2

发现了 Paul Higinbotham 撰写的这篇精彩的博客文章PowerShell ForEach-Object Parallel Feature

从这篇博文中我得到了以下要点:

脚本块在称为 PowerShell 运行空间的上下文中运行。运行空间上下文包含所有定义的变量、函数和加载的模块。

如前所述,新的 ForEach-Object -Parallel 功能使用现有的 PowerShell 功能来并发运行脚本块......PowerShell 本身根据其设计和历史记录对脚本如何并发运行施加了条件。脚本必须在运行空间上下文中运行,并且运行空间内一次只能运行一个脚本线程。因此,为了同时运行多个脚本,必须创建多个运行空间。

因此,它确认运行空间是其主要驱动因素,并提供了有关线程安全操作等的更多信息。有关运行空间的任何先前答案或详细信息都与此处相关,因为这是官方标准库中并行操作的运行空间的成熟实现。社区已经完成了面向运行空间的其他实现,但现在不包含任何外部模块依赖项。

感谢Paul对社区做出的杰出贡献!