PowerShell中Push-Location/Pop-Location在ForEach-Object -Parallel中是否线程安全?
PowerShell并行ForEach-Object中位置栈的线程安全性问题
每个并行任务的运行空间都拥有独立的位置栈,所以Push-Location和Pop-Location操作是线程安全的,不同并行线程不会共享同一位置栈。
具体说明:
- PowerShell的
ForEach-Object -Parallel会为每个并行执行的任务创建独立的运行空间(Runspace),每个运行空间都维护自己的执行上下文,包括当前工作目录、位置栈这类会话专属的状态数据。 - 你在脚本中调用
Push-Location时,只会将路径压入当前任务对应运行空间的位置栈;调用Pop-Location时,也只会操作该运行空间内的栈。其他并行任务的位置栈不会受到任何干扰。
可以用以下代码快速验证这一点:
1..3 | ForEach-Object -Parallel { Push-Location $env:TEMP Write-Host "任务 $_ 当前位置: $PWD,栈深度: $(Get-Location -Stack).Count" Start-Sleep 1 Pop-Location Write-Host "任务 $_ 弹出后位置: $PWD,栈深度: $(Get-Location -Stack).Count" }
执行后会观察到每个任务的位置栈操作都是独立的,不会出现跨任务的栈状态污染。
内容的提问来源于stack exchange,提问作者John Don
相关产品推荐
相关产品推荐

