2017-05-01 7 views
0

Ich habe Probleme bei der Strukturierung meines Makefile, um meine Shell-Skripts in der gewünschten Reihenfolge auszuführen.Ausführen von Aufgaben parallel zu Makefile

Hier ist meine aktuelle Make-Datei

## Create data splits 
raw_data: src/data/get_data.sh 
    src/data/get_data.sh 
    hadoop fs -cat data/raw/target/* >> data/raw/target.csv 
    hadoop fs -cat data/raw/control/* >> data/raw/control.csv 
    hadoop fs -rm -r -f data/raw 
    touch raw_data_loaded 

split_data: raw_data_loaded 
    rm -rf data/interim/splits 
    mkdir data/interim/splits  
    $(PYTHON_INTERPRETER) src/data/split_data.py 

## Run Models 
random_forest: split_data 
    nohup $(PYTHON_INTERPRETER) src/models/random_forest.py > random_forest & 

under_gbm: split_data 
    nohup $(PYTHON_INTERPRETER) src/models/undersampled_gbm.py > under_gbm & 

full_gbm: split_data 
    nohup $(PYTHON_INTERPRETER) src/models/full_gbm.py > full_gbm & 

# Create predictions from model files 
predictions: random_forest under_gbm full_gbm 
    nohup $(PYTHON_INTERPRETER) src/models/predictions.py > predictions & 

Das Problem

Alles funktioniert ok, bis ich den ##Run Models Abschnitt beginnen. Dies sind alles unabhängige Skripte, die alle einmal ausgeführt werden können, sobald split_data fertig ist. Ich möchte jedes der 3 Modellskripte gleichzeitig ausführen, also führe ich jedes im Hintergrund mit &.

Das Problem ist, dass meine letzte Aufgabe, predictions beginnt gleichzeitig mit den drei vorhergehenden Aufgaben ausgeführt wird. Was ich möchte, ist, dass die 3 simultanen Modellskripte beendet werden und dann predictions ausgeführt wird.

Mein Versuch

Meine vorgeschlagene Lösung ist meine endgültige Modell Aufgabe ausgeführt werden soll, full_gbm ohne &, so dass predictions bis nicht ausgeführt wird, dass beendet ist. Das sollte funktionieren, aber ich frage mich, ob es einen weniger "hacky" Weg gibt, dies zu erreichen - gibt es eine Möglichkeit, die Zielvariablen zu strukturieren, um das gleiche Ergebnis zu erzielen?

Antwort

1

Sie sagen nicht, welche Implementierung von Make Sie verwenden. Wenn es GNU Make ist, können Sie es mit der Option -j aufrufen, damit es entscheiden kann, welche Jobs parallel ausgeführt werden sollen. Dann können Sie die nohup und & von allen Befehlen entfernen; predictions wird nicht gestartet, bis alle random_forest under_gbm full_gbm abgeschlossen sind, und der Build selbst wird nicht beendet, bis predictions abgeschlossen ist.

Außerdem verlieren Sie nicht den wichtigen Ausgangsstatus der Befehle.

Verwandte Themen