如何等待所有并行运行的批处理文件完成后再继续执行命令?

问题描述 投票:0回答:1

我有一组活动应该在一组会话中并行运行。

每个会话将并行运行所有任务,直到所有并行任务完成后才会运行下一个会话。

run_all_sessions.bat
-> 每行都应该运行,一次一行,直到前一行结束了里面的所有任务后才启动下一行
run_batches_1_to_4_in_parallel.bat
:

start /wait run_batches_1_to_4_in_parallel.bat session_id=1
start /wait run_batches_1_to_4_in_parallel.bat session_id=2
start /wait run_batches_1_to_4_in_parallel.bat session_id=3
start /wait run_batches_1_to_4_in_parallel.bat session_id=4

Were

run_batches_1_to_4_in_parallel.bat
是一个批处理文件,包含以下信息:

start "running_batch_1" batch1.bat %1
start "running_batch_2" batch2.bat %1
start "running_batch_3" batch3.bat %1
start "running_batch_4" batch4.bat %1
exit

我遇到的问题是,由于

run_batches_1_to_4_in_parallel.bat
内部没有/wait,然后运行
run_all_sessions.bat
中的下一行,由于
batch*.bat
的执行需要占用大量资源,因此会堵塞机器。

我想要找到的解决方案是修改

run_batches_1_to_4_in_parallel.bat
,即在
run_all_sessions.bat
中的所有
batch*.bat
完成并返回其终止代码之前,我不会将控制权返回给
run_batches_1_to_4_in_parallel.bat
。需要注意的是:

  • 每个batch*.bat返回大量stdout和stderr消息
  • 每个
    batch*.bat
    的运行时间都不同,我必须等到所有的都完成。
  • 无法在
    run_batches_1_to_4_in_parallel.bat
    中添加暂停,因为 run_all_sessions.bat 脚本应该完全运行而无需用户交互。
  • 异步解决方案优于定期检查进度的同步解决方案,因为性能对于机器来说至关重要。

答案https://stackoverflow.com/a/33586872/4919040建议使用

set /P "="
但预计所有batch*.bat都会在stdout中返回大量输出,因此这种方法不可行。

答案https://stackoverflow.com/a/33585114/4919040建议检查任务列表和过滤,但我既不想按进程名称过滤,也不想定期轮询和检查进程是否已完成。

答案 https://stackoverflow.com/a/49051876/4919040 没有用,因为暂停命令需要用户交互。

有人建议我使用以下解决方案

run_batches_1_to_4_in_parallel.bat
但我担心它不能确保在batch*.bat完成后返回控制。
start "running_batch_1" batch1.bat %1
start "running_batch_2" batch2.bat %1
start "running_batch_3" batch3.bat %1
start "running_batch_4" /wait batch4.bat %1
exit


windows batch-file cmd parallel-processing
1个回答
0
投票

每个子批次在启动时需要在定义的“信号量”文件夹中创建批次特定的信号文件,并在完成时删除该信号文件。

您的主批次需要在激发子批次后运行无限循环并检查信号量文件夹是否为空。如果信号量文件夹中至少有一个文件,则表明仍有子批次处于活动状态,您需要休眠并在几秒钟后重新检查。如果信号量文件夹为空,您可以假设所有子批次已完成并且可以继续。

© www.soinside.com 2019 - 2024. All rights reserved.