Как написать эквивалент асинхронного узла параллельно в PowerShell? - PullRequest
0 голосов
/ 03 января 2019

В node.js вы можете запустить несколько асинхронных функций одновременно, а затем заставить их возвращать результаты функции, когда все они завершены: понимание-узел-js-асинхронная-параллельная

В PowerShell я видел похожую функциональность, используя Start-Job, но!когда на самом деле пытаются выполнить задачи, они, кажется, слишком сильно отстают, чтобы быть неблокирующими, и запускаются параллельно:

   Write-Host "Running jobs $($start) - $($end)"
   for($i = [int]$start; $i -le $end; $i++) {
     $jobResults += Start-Job -ScriptBlock $someFunc | wait-job | receive-job
   }

Я полагаю, что это происходит от функции wait-job, которая ожидает запущенную работузавершить до его получения.

Есть ли способ ожидания всех из них и получения их в массив, как это делает узел async?Или я смотрю на яблоки и апельсины здесь?

1 Ответ

0 голосов
/ 03 января 2019

Ваш фрагмент фактически выполняет задания синхронно.Чтобы запустить их асинхронно, сделайте что-то вроде этого:

$jobs = {sleep 5; Write-Output "job1"}, {sleep 6; Write-Output "job2"}, {sleep 7; Write-Output "job3"}

$result = $jobs | foreach {  start-job $_ } | wait-job | receive-job

Хотя Start-Job создаст новый процесс (вероятно, не лучший вариант, если ваши задания выполняются всего за несколько секунд).Если вам нужно запускать задания в отдельных потоках, вам нужно использовать пространства выполнения.Вы можете кодировать его вручную, но для этого также есть несколько инструментов (например, Invoke-Parallel )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...