powershell 中的 foreach 与 ForEach-Object -Parallel - 出了什么问题?

use*_*666 6 parallel-processing powershell azure-blob-storage foreach-object

我对 ForEach-Object -Parallel 感到困惑。以下代码有包含超过 2000 个 blob 的 $blobs 数组。使用常规的foreach,我可以毫无问题地打印每个 blob 的名称。然后在第一个 foreach 之后使用ForEach-Object -Parallel ,不会打印任何内容。为什么 ?

foreach ($blob in $blobs) {
           Write-Host    $blob.Name
}

# Use parallel processing to process blobs concurrently
$blobs|ForEach-Object -Parallel {
         param (
             $blob)
    
        Write-Host $blob.Name 
} -ThrottleLimit 300
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 8

传递给cmdlet调用的脚本块(无论您是否使用)通过自动变量(也称为)式接收其(管道)输入。(换句话说:没有必要或没有必要声明参数ForEach-Object -Parallel$_$PSItem

$blobs |
  ForEach-Object -Parallel {
    $_.Name  # $_ implicitly refers to the pipeline input object at hand
  } 
Run Code Online (Sandbox Code Playgroud)
  • 相比之下,该语句需要一个自选的迭代器变量(例如在您的示例中)。foreach $blob

    • 也许令人困惑的是,它foreach也是cmdlet别名,并且语法上下文决定是引用语言语句还是cmdletForEach-Object foreach
  • 请注意,该参数控制一次-ThrottleLimit允许的线程数。对于 CPU 密集型操作,指定高于可用 CPU 核心的数字是没有意义的;仅对于网络绑定、I/O 绑定或等待事件的操作,较高的数字才有意义。

  • 对于ForEach-Object cmdlet, while$_与或不与 一起使用,在从调用者范围引用变量方面-Parallel存在重要区别:

    • 对于-Parallel,您需要$using:范围;例如:

      $foo = 'bar'
      # Note the $using:foo reference.
      # *Without* -Parallel, use just $foo
      # -> 'bar1', 'bar2', 'bar3'
      1..3 | ForEach-Object -Parallel { $using:foo + $_ }
      
      Run Code Online (Sandbox Code Playgroud)