所以我有一個批處理檔案,它在給定一些輸入引數的情況下執行模擬,然后通過 awk、R 和 Python 處理輸出資料。目前,輸入引數通過一些嵌套的 for 回圈傳遞到模擬中,模擬的每次迭代都將一個接一個地運行。我希望并行執行模擬,因為目前有 1,000 多個案例,所以在我看來,我可以讓核心 1 處理模擬人生 1-250、核心 2 處理模擬人生 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
uj5u.com熱心網友回復:
我實際上能夠通過執行以下操作來完成此操作:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314661.html
