Pausieren Sie alle Aufgaben außer x CPU-intensiven Aufgaben

619
Andrew Grimm

Ich habe etwa 50 Ordner mit Daten, die zu verarbeiten sind, und ich habe ein Ruby-Skript, das die Dateien eines Ordners verarbeitet (der Ordner, der verarbeitet wird, basiert auf einer .yml-Konfigurationsdatei). Und einen Computer mit vier CPUs.

Ich möchte die 50 Prozesse in Betrieb nehmen können, aber nur vier von ihnen sind zu jeder Zeit aktiv und die anderen 46 haben angehalten. Sobald einer der Prozesse abgeschlossen ist, möchte ich, dass einer der angehaltenen Prozesse nicht angehalten wird, bis alle 50 abgeschlossen sind. So kann ich das machen

./super_script.rb > folder_1_log.txt *edit config.yml* ./super_script.rb > folder_2_log.txt *edit config.yml* ... 

Und konzentrieren Sie sich auf etwas anderes, bis die Verarbeitung abgeschlossen ist.

Kann man das machen? Gibt es einige Bedingungen für das, was ich will, dass ich googeln kann?

(Eine andere Alternative wäre, super_script multithreadingfähig zu machen - vielleicht bin ich eine Furcht erregende Katze, weil ich diesen Ansatz nicht annehme)

(Das Betriebssystem ist Ubuntu Linux, und die meiste CPU-Zeit wird nicht von super_script.rb beansprucht, sondern von anderen Ruby-Programmen über system () aufgerufen).

0
Gehört diese Frage nicht auf StackOverflow.com? Peter Mortensen vor 12 Jahren 0
@Peter Ich hätte das Gegenteil gedacht. Welche Tags würdest du bei SO geben? Andrew Grimm vor 12 Jahren 0
Mögliche Tags (OK, einige davon sind übertrieben): bash-programmierung bash-script Ruby Multiprogrammierung Batchverarbeitung prozessübergreifende Kommunikation verteiltes Computing Cluster-Computing Peter Mortensen vor 12 Jahren 0

1 Antwort auf die Frage

2
Martin B

Hier ist ein Bash-Skript, das aussieht, als würde es etwas tun, was Sie wollen. Es startet eine Reihe von Prozessen parallel, stellt jedoch sicher, dass nicht mehr als n gleichzeitig ausgeführt werden.

Auf der anderen Seite, wenn das, was Sie tun, festplattengebunden und nicht CPU-gebunden ist (ich frage Sie, weil Sie "50 Ordner mit zu verarbeitenden Daten" haben), sind Sie möglicherweise besser dran Ausführen aller Prozesse seriell, um Konflikte zwischen den Prozessen für die Festplatte zu vermeiden.

Vielen Dank. Ich habe mein Skript http://gist.github.com/148221 darauf basiert Andrew Grimm vor 12 Jahren 0