【问题标题】:Start multiple tasks in parallel and wait for them in windows?并行启动多个任务并在 Windows 中等待它们?
【发布时间】:2018-08-09 13:48:44
【问题描述】:

如何在批处理脚本中并行执行一些任务并等待它们?

command1;

# command3, command4 and command5 should execute in sequence say task1
# command6, command7 and command8 should execute in sequence say task2
# both task1 and task2 should run independently

command3; command4; command5 | command6; command7; command8;

# should execute only after the above parallel tasks are completed

command9;

作为概念证明,我尝试了类似的方法,但它不起作用:

echo "Starting"
start /wait wait20.bat   
start /wait wait40.bat 
echo "Finishing"

wait20.bat 看起来像:

echo "starting 20 seconds job"
timeout 20
echo "finishing 20 seconds job"

我做错了什么?

【问题讨论】:

标签: windows batch-file cmd parallel-processing


【解决方案1】:

我认为this is 是最简单的方法:

command1

(
   start "task1" cmd /C "command3 & command4 & command5"
   start "task2" cmd /C "command6 & command7 & command8"
) | pause

command9

cmetsthis answer 下方的更多详细信息。

【讨论】:

  • 这太优雅了!但是,我在这里有一个疑问。如果我只是做一个start task1,它会在后台执行它而不监控它。那么这段代码的哪一部分实际上完成了等待后台任务完成的重要部分呢?是()| 还是pause?我阅读了评论中的解释,但它谈到了set /P
  • 管道 | 是否与任何从标准输入读取输入的命令组合在一起,例如 pauseset /P。这样的命令将等到start 命令发送输出(这永远不会发生)后台进程结束...
  • 嗯...您知道您可以根据需要更改所选答案吗? ;)
【解决方案2】:

这是一个如何使用任务列表和进程窗口标题的示例:

launcher.cmd

@echo off
for /l %%a in (1,1,5) do start "worker%%a" cmd /c worker.cmd & timeout /t 1 >nul
:loop
timeout /t 2 >nul
tasklist /v /fi "imagename eq cmd.exe" /fo csv | findstr /i "worker" >nul && goto :loop
echo Workers finished

worker.cmd

@echo off
set /a wait=2 + ( %RANDOM% %% 5 ) 
echo waiting for %wait%...
timeout /t %wait% >nul
echo I'm done!
timeout /t 2 >nul

我正在使用tasklist /v /fo csv 来获取标题。

【讨论】:

  • 谢谢。有没有办法不在控制台中显示tasklisttimeout 命令?
  • 只需将输出重定向到 nul:timeout /t NN >nul, findstr /i ... >nul
  • 这仍然显示timeout 命令,而不是输出
  • 这种方法浪费CPU时间重复执行tasklistfindstr命令直到并行进程结束。 event driven method 更高效、更简单...
  • @wolfrevokcats,Aacini 的观点是,另一种方法是事件驱动的。它只是在准备就绪时唤醒进程,这总是比轮询更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2014-09-20
  • 2012-03-03
  • 2021-12-13
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多