我有一组活动应该在一组会话中并行运行。
每个会话将并行运行所有任务,直到所有并行任务完成后才会运行下一个会话。
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
的运行时间都不同,我必须等到所有的都完成。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
每个子批次在启动时需要在定义的“信号量”文件夹中创建批次特定的信号文件,并在完成时删除该信号文件。
您的主批次需要在激发子批次后运行无限循环并检查信号量文件夹是否为空。如果信号量文件夹中至少有一个文件,则表明仍有子批次处于活动状态,您需要休眠并在几秒钟后重新检查。如果信号量文件夹为空,您可以假设所有子批次已完成并且可以继续。