首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待异步批处理任务完成未正常工作

等待异步批处理任务完成未正常工作
EN

Stack Overflow用户
提问于 2020-09-02 17:58:40
回答 1查看 29关注 0票数 0

我创建这个脚本的灵感来自于如何等待parralel批处理脚本完成的this answer,并创建了这个脚本。

代码语言:javascript
复制
@echo off

set "lock=%temp%\wait%random%.lock"

start "1" /D .\RESULTS\1 cmd /c  9>"%lock%0" "1.exe"
start "2" /D .\RESULTS\2 cmd /c  9>"%lock%1" "2.exe"
start "3" /D .\RESULTS\3 cmd /c  9>"%lock%2" "3.exe"
start "4" /D .\RESULTS\4 cmd /c  9>"%lock%3" "4.exe"

:Wait0 for all scripts to finish (wait until lock files are no longer locked)
1>nul 2>nul ping /n 2 ::1
for %%N in (0 1 3) do (
  setlocal enabledelayedexpansion
  set L=!!lock!%%N!
  ( rem
  ) 9>!L! || goto :Wait0
) 2>nul

timeout /t 10 /nobreak
echo 1 done
echo 2 done
echo 3 done
echo 4 done





start "5" /D .\RESULTS\5 cmd /c  9>"%lock%4" "5.exe"
start "6" /D .\RESULTS\6 cmd /c  9>"%lock%5" "6.exe"
start "7" /D .\RESULTS\7 cmd /c  9>"%lock%6" "7.exe"
start "8" /D .\RESULTS\8 cmd /c  9>"%lock%7" "8.exe"

:Wait1 for all scripts to finish (wait until lock files are no longer locked)
1>nul 2>nul ping /n 2 ::1
for %%N in (4 1 7) do (
  setlocal enabledelayedexpansion
  set L=!!lock!%%N!
  ( rem
  ) 9>!L! || goto :Wait1
) 2>nul

timeout /t 10 /nobreak
echo 5 done
echo 6 done
echo 7 done
echo 8 done




start "9" /D .\RESULTS\9 cmd /c  9>"%lock%8" "9.exe"
start "10" /D .\RESULTS\10 cmd /c  9>"%lock%9" "10.exe"

:Wait2 for all scripts to finish (wait until lock files are no longer locked)
1>nul 2>nul ping /n 2 ::1
for %%N in (8 1 9) do (
  setlocal enabledelayedexpansion
  set L=!!lock!%%N!
  ( rem
  ) 9>!L! || goto :Wait2
) 2>nul

timeout /t 10 /nobreak
echo 9 done
echo 10 done


::delete the lock files
del "%lock%*"

一开始,1.exe2.exe3.exe4.exe循环似乎都运行得很好,所有的循环都完成了工作,然后才继续运行。问题从5.exe 6.exe 7.exe 8.exe的第二个循环开始。然后,在2到3个程序完成后,它的工作循环退出,而不是等待最后一个程序完成它的工作。Any1可以看到这个脚本中的错误,除了这可能不是编写这段代码的最有效方式?

EN

回答 1

Stack Overflow用户

发布于 2020-09-02 19:42:24

好吧,我试着理解锁背后的魔力,发现是一个.lock文件本身起了作用。因此,我创建了一些更简单的东西,而不是set "lock=%temp%\wait%random%.lock"

代码语言:javascript
复制
echo. 2>lock0.lock
echo. 2>lock1.lock
echo. 2>lock2.lock
echo. 2>lock3.lock

只有4个锁定文件,因为我只计划运行4个.exe文件一次。然后更改了这些行

代码语言:javascript
复制
start "1" /D .\RESULTS\1 cmd /c  9>"%lock%0" "1.exe"
start "2" /D .\RESULTS\2 cmd /c  9>"%lock%1" "2.exe"
start "3" /D .\RESULTS\3 cmd /c  9>"%lock%2" "3.exe"
start "4" /D .\RESULTS\4 cmd /c  9>"%lock%3" "4.exe"

代码语言:javascript
复制
start "1" /D .\RESULTS\1 cmd /c  9>"lock0.lock" "1.exe"
start "2" /D .\RESULTS\2 cmd /c  9>"lock1.lock" "2.exe"
start "3" /D .\RESULTS\3 cmd /c  9>"lock2.lock" "3.exe"
start "4" /D .\RESULTS\4 cmd /c  9>"lock3.lock" "4.exe"

并在循环内更改为

代码语言:javascript
复制
( rem
) 9>"lock0.lock" || goto :Wait0
( rem
) 9>"lock1.lock" || goto :Wait0
( rem
) 9>"lock2.lock" || goto :Wait0
( rem
) 9>"lock3.lock" || goto :Wait0

并最终删除所有的锁定文件

代码语言:javascript
复制
del "lock0.lock"
del "lock1.lock"
del "lock2.lock"
del "lock3.lock"

我知道这是一个糟糕的解决方案,但也许有人会发现这是有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63703129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档