有没有办法在批处理文件中完成多线程或并行进程?

Posted

技术标签:

【中文标题】有没有办法在批处理文件中完成多线程或并行进程?【英文标题】:Is there a way to accomplish multithreading or parallel processes in a batch file? 【发布时间】:2021-11-21 16:20:44 【问题描述】:

所以我有一个批处理文件,它在给定一些输入参数的情况下执行模拟,然后通过 awk、R 和 Python 处理输出数据。目前,输入参数通过一些嵌套的 for 循环传递到模拟中,并且模拟的每次迭代将一个接一个地运行。我希望并行执行模拟,因为目前有 1,000 多个案例,所以在我看来,我可以让核心 1 处理 sims 1-250,核心 2 处理 sims 251-500,等等。

本质上我想做的是:

    跨多个内核运行每个模拟案例 每次模拟完成后,开始输出数据处理

我试过使用start /affinity n simulation.exe,但这里的问题是所有的模拟都将同时执行,所以当它进入后处理调用时,它会出错,因为数据还没有生成。有start /w 命令,但我不确定这是否会改善模拟。我想到的一个想法是在每次模拟完成后更新一个变量,然后仅在变量达到 n 次运行时才开始后处理。

这是我现在正在做的事情的摘录:

    for %%f in (1 2 3) do (
            for %%a in (4 5 6) do (
                for %%b in (7 8 9) do (
                    call :mission %%f %%a %%b
                )
            )
         )
    some gawk scripts
    some python scripts
    some r scripts
    go to :exit

:mission
   sed -e 's/text1/%1/' -e 's/text2/%2/' -e 's/text3/%3/'
   simulation.exe
   go to :exit

:exit

这是我用来测试一些并行处理的方法:

start /affinity 1 C:\Users\614890\R-4.1.1\bin\Rscript.exe test1.R
start /affinity 2 C:\Users\614890\R-4.1.1\bin\Rscript.exe test2.R
start /affinity 3 C:\Users\614890\R-4.1.1\bin\Rscript.exe test3.R
start /affinity 4 C:\Users\614890\R-4.1.1\bin\Rscript.exe test4.R

C:\Users\614890\R-4.1.1\bin\Rscript.exe plotting.R

【问题讨论】:

请阅读 SO 的运作方式。 ***.com/help SO 专注于具体的失败,并回避寻求意见的问题。 不知道对你有没有帮助Multi-Threaded_Network_IP_Ports_Scanner.bat Event-driven multi-thread scheme for Batch files 另见Parallel execution of shell processes @dbenham:你的并行执行控制方式依然使用循环和Batch命令来监督并行进程的开始和结束…… 【参考方案1】:

我实际上是通过执行以下操作来做到这一点的:

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

:: Launch processes asynchronously, with stream 9 redirected to a lock file.
:: The lock file will remain locked until the script ends
start /affinity 1 9>"%lock%1" Rscript test1.R
start /affinity 2 9>"%lock%2" Rscript test2.R
start /affinity 4 9>"%lock%3" Rscript test3.R
start /affinity 8 9>"%lock%4" Rscript test4.R

:Wait for all processes to finish
1>nul 2>nul ping /n 2 ::1
for %%F in ("%lock%*") do (
 (call ) 9>"%%F" || goto :Wait
) 2>nul

del "%lock%*"

Rscript plotting.R

【讨论】:

以上是关于有没有办法在批处理文件中完成多线程或并行进程?的主要内容,如果未能解决你的问题,请参考以下文章

批处理文件 FOR 循环改进

Spring Batch -扩展和并行处理

使用 c++ async 进行并行编程

多线程

7.01_线程

day24