Запустить несколько действий одновременно в make-файле - PullRequest
0 голосов
/ 30 мая 2019

У меня есть следующее makefile.

Я бы хотел, чтобы step0 запускался, тогда я бы хотел, чтобы все b*.R сценарии запускались одновременно в step1.Когда step1 завершен, я бы хотел, чтобы final запустился.

Когда я запускаю make или make -j 8, кажется, что все файлы b*.R все еще работают последовательно.Правильно ли настроен makefile для одновременного запуска всех файлов b*.R?Если не то, что мне нужно изменить.

final : step1
    Rscript c.R

step1 : step0
    Rscript b1.R
    Rscript b2.R
    Rscript b3.R
    Rscript b4.R
    Rscript b5.R
    Rscript b6.R

step0 : 
    Rscript a.R

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Когда я запускаю make или make -j 8, кажется, что все файлы b * .R по-прежнему работают последовательно.

-jN допускает параллельное выполнение различных рецептов , а не отдельных команд, составляющих рецепт.

Таким образом, make-файл должен быть реструктурирован так:

.PHONY: final b1 b2 b3 b4 b5 b6 step0

final: b1 b2 b3 b4 b5 b6
b1 b2 b3 b4 b5 b6: step0

b1: ;Rscript b1.R
b2: ;Rscript b2.R
b3: ;Rscript b3.R
b4: ;Rscript b4.R
b5: ;Rscript b5.R
b6: ;Rscript b6.R

step0: ;Rscript a.R
1 голос
/ 30 мая 2019

Если вы хотите, чтобы make обрабатывал параллелизм для вас, вам нужно реструктурировать make-файл, чтобы иметь разные цели. Например:

step1: b1 b2 b3 b4 b5 b6 
b1: step0
    Rscript b1.R
b2: step0
    Rscript b2.R
...

step0 : 
    Rscript a.R

Или вы можете позволить оболочке выполнить параллелизм и написать:

step1: step0
    Rscript b1.R & Rscript b2.R & \
    Rscript b3.R & ... & wait

Я бы порекомендовал первое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...