【发布时间】:2020-03-24 19:13:43
【问题描述】:
PowerShell 7 引入了一项非常需要的功能,用于并行运行管道输入。
PowerShell 7 的文档没有提供有关如何实现的任何详细信息。
在使用过 PoshRSJob 和 Invoke-Parallel 模块之前,我知道运行空间传统上被认为是在 powershell 中进行并行操作比运行 PowerShell 作业更有效的方法。我已经阅读了一些混合内容,表明这是现在使用线程而不是运行空间,但找不到其他具体内容。
我非常感谢您对以下方面的技术见解:
- 从 .NET 角度来看,执行的生命周期是什么
- 新功能是运行空间还是线程? (或者运行空间只是 System.Management.Automation 中的一个 .NET 线程?)
- 既然我们正在转向并行操作,这是否会给传统调试带来任何复杂性? 从历史上看,我对运行空间进行了一段艰难的调试,并且不确定哪些选项可能会得到改进
【问题讨论】:
-
根据我看到的文章,它使用运行空间。您需要将 $vars 发送到其中 [通常使用
$Using:]。它将所有需要的模块和功能以及诸如此类的东西加载到每个运行空间中,因此设置和拆除需要时间。到目前为止,我还没有看到任何有关调试的信息。 -
独立的运行空间,通过新的内部 API (
PSTaskPool) 进行管理。 The RFC 详细介绍了关于实现和约束的一些 细节。 The source code 还包含许多有用的 cmets -
以防万一(谁知道)还有 SplitPipeline 具有一些独特的功能(恕我直言,确实如此),例如它适用于非常大或无限的输入。
-
还有start-threadjob,我相信是同一个人写的。它不会序列化像 start-job 这样的对象。
-
RFC 也向我指出了一些很棒的信息。如果稍后回答其中一些问题,将在此处查看并发布答案。 RFC0044-ForEach-Parallel-Cmdlet
标签: powershell runspace powershell-core