首页 > 解决方案 > 如何在 PowerShell 中并行编写等效于节点的异步?

问题描述

在 node.js 中,您可以一次启动多个异步函数,然后让它们在它们全部完成后将结果返回给一个函数:理解节点 js-async-parallel

在 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等待启动的工作在接收之前完成的功能。

有没有办法等待所有这些并将它们接收到像节点异步一样的数组中?还是我在这里看苹果和橘子?

标签: node.jspowershellasynchronous

解决方案


您的代码段实际上是在同步运行作业。要异步运行它们,请执行以下操作:

$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


推荐阅读