PowerShell 7引入了一个非常需要的功能,用于并行运行管道输入。
PowerShell 7的文档没有提供有关如何实现此功能的任何详细信息。
以前使用过PoshRSJob
和Invoke-Parallel
模块,我知道运行空间传统上被认为是在powershell中进行并行操作的更有效的方法,而不是运行powershell作业。我读过一些混合内容,表明现在使用线程而不是运行空间,但找不到其他特定内容。
我真的很感激对的一些技术见解
- 从.NET的角度来看,执行的生命周期是什么
- 新功能是运行空间还是线程(或者运行空间只是System.Management.Automation中的.NET线程?(
- 现在我们进入并行操作,这会给传统调试带来复杂性吗从历史上看,我在调试运行空间时遇到了困难,不确定哪些选项可能得到了改进
调试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对社区的贡献!👍