PowerShell 7为并行运行管道输入引入了一个非常需要的特性。
PowerShell 7的文档没有提供关于如何实现这一点的任何细节。
以前利用过PoshRSJob和Invoke-Parallel模块,我知道运行空间传统上被认为是比运行powershell作业更有效的并行操作方法。我读过一些混合内容,表明这是现在使用线程,而不是运行空间,但找不到任何其他特定的内容。
我非常希望能对以下问题有一些技术见解:
发布于 2020-05-08 19:27:09
找到了这个奇妙的博客文章PowerShell ForEach对象并行特性由保罗希金波坦。
在这篇博客文章中,我删除了一些重要的亮点:
脚本块在称为PowerShell运行空间的上下文中运行。运行空间上下文包含所有定义的变量、函数和加载的模块。 如前所述,新的ForEach对象-Parallel特性使用现有的PowerShell功能来运行脚本块,concurrently....PowerShell本身根据脚本的设计和历史对脚本如何并发运行施加了条件。脚本必须在运行空间上下文中运行,并且每次只能在运行空间中运行一个脚本线程。因此,为了同时运行多个脚本,必须创建多个运行空间。
因此,它确认运行空间是这方面的主要驱动程序,并提供了一些关于threadsafe操作的更多信息。在运行空间中提供的任何先前的答案或细节在这里都是相关的,因为这是一个成熟的运行空间实现,用于官方标准库中的并行操作。其他实现是由面向运行空间的社区完成的,但现在没有外部模块依赖。
感谢保罗为社区做出的如此好的贡献!
发布于 2020-05-20 02:32:37
调试foreach-对象-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和调试-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://stackoverflow.com/questions/60837777
复制相似问题