Как заставить Powershell выполнять конвейеры асинхронно, а не «последовательно»?
Пример, иллюстрирующий это:
Function PipeDelay($Name, $Miliseconds){
Process {
Sleep -miliseconds $Miliseconds
Write-Host "$Name : $_"
$_
}
}
1..7 | PipeDelay Fast 100 | PipeDelay Slow 300 | PipeDelay Slowest 900
Вывод как в ISE, так и в powershell следующий:
Fast : 1
Slow : 1
Slowest : 1
1
Fast : 2
Slow : 2
Slowest : 2
2
Fast : 3
Slow : 3
Slowest : 3
3
...
Это как если бы Powershell последовательно запускал весь конвейер для одного входного объекта перед обработкой следующего входного объекта. Выполнение выглядит примерно так:
Fast : 1 2 3
Slow : 1---1 2---2 3---3
Slowest : 1---------------1 2---------------2 3-----...
Возможно ли с некоторыми настройками/переменными среды/и т.д. заставить конвейеры работать независимо/асинхронно? возможно, с настройкой размера буфера конвейера и т. д.? Так что выполнение будет выглядеть примерно так:
Fast : 1 2 3 4 5 6 7
Slow : 1---1 2---2 3---3 4---4 5---5 6---6 7---7
Slowest : 1---------------1 2---------------2 3-----...
ПРИМЕЧАНИЕ
Я думал, что это из-за режима STA/MTA. Я не понимаю их полностью, но тот же результат в ISE (STA) / Powershell Shell (MTA), похоже, устраняет режим STA / MTA как причину.
Кроме того, я думал, что Write-Host
является проблемой, которая заставляет конвейер обрабатываться последовательно, но даже если я заменю Write-Host
на New-Event
, последовательная обработка все равно будет применяться.
load-from-file | do-something-fast | do-something-slow | do-something-slowest | save-to-file
- person Gregor y   schedule 30.07.2019