首页 > 解决方案 > 如何停止并行线程

问题描述

如果其中一个线程完成,我想停止所有线程。像Kill-AllThreads 之类的东西。

电源外壳:

workflow Test{
    function writeFile($c, $n){
        $path = "$env:temp\workflow_$n.txt"
        Remove-Item $path -ea 0
        while($true){
            $i++
            "$n-$i"|Out-File $path -Append
            if($i -eq $c){"$n - finished";Kill-AllThreads;break}
        }
    }
    parallel {
        writeFile 5 i
        writeFile 10 k
    }
}

test

start "$env:temp\workflow_i.txt"
start "$env:temp\workflow_k.txt"

PowerShell 核心:

((5,'i'), (10,'k'))|ForEach-Object -Parallel{
    $c, $n = $_
    $path = "$env:temp\workflow_$n.txt"
    Remove-Item $path -ea 0
    while($true){
        $i++
        "$n-$i"|Out-File $path -Append
        if($i -eq $c){"$n - finished";Kill-AllThreads;break}
    }
}

start "$env:temp\workflow_i.txt"
start "$env:temp\workflow_k.txt"

我希望i - finished在控制台中;i-1..5k-1..5在文件中。

标签: powershellpowershell-core

解决方案


嗯,这是一种根据输出数量(powershell 7)杀死管道的方法。它创建了 10 个随机休眠的线程,然后在接收到第一个线程的输出时终止管道。

1..10 | foreach -parallel { $a = random -max 10 -min 1; sleep $a; $a } | 
  select -first 1

2

推荐阅读