[Megoldva] Szkript futtatás párhuzamosan, automatizáltan

Fórumok

A következő problémára biztos talált már ki valami jó megoldást:

Vagy egy Python-szkriptem, mely egy bemenettel 10-20 másodpercig dolgozik. Ezt sok alkalommal le kell futtatnom 50-100 fájl mindegyikére. A gépemben van 4 core. Jó lenne, ha egy "ütemező"-féle magától gondoskodna arról, hogy legyen mindig 4 aktív szkript-futtatás, és így szépen párhuzamosan lehetne futtatni a cuccot, előbb jutnék az eredményhez. A RAM-igény túl nagy ahhoz, meg nem is lenne hatékony, hogy mind a 100-at egyszerre indítsam és rábízzam a Linux ütemezőre a beosztást.

Ti hogy csinálnátok? Meg lennék lepve, ha nem csinált volna valaki ilyen shell-utilityt, de nekem nem sikerült találnom ilyet 15 perc alatt.

Előre is kösz!

*Megoldás*: a lentebb javasolt "pexec" tökéletesen bevált. A parallel-t ki sem próbáltam, de gondolom, az ugyanilyen jó lett volna. Kösz!

Hozzászólások

Készítesz egy 4 mélységű csúszóablakot, amelyet első lépésben az indítandó parancslistád első 4 elemével töltesz fel a
taskset CPUMAG iCMD
paranccsal.

Valahányszor az egyik parancsod eltűnik a processzlistából, veszed a parancslista következő elemét, és ráuszítod az elárvult magra.

(Sztem amúgy túl van lihegve a külön magozás, de guszti busza).

Kösz.

De a csúszóablak azért nem optimális, mert az egyes szkriptek futásideje eltérhet egy 3-4-szeres szorzó erejéig.

Olyan "intelligens" ütemező kellene, mely indít 4-et a sok feladatból, és ha bármelyik végez, akkor egy újat, stb.

A taskset-ezés szerintem felesleges: a Linux ütemező majd kiosztja a CPU-k közt a feladatot. Nekem csak az kellene, hogy ne nekem kelljen megírni azt a progit, ami arról gondoskodik, hogy mindig 4 process fusson a listából. (Tudnék ilyet írni, de minek, hisz feltehetően más is járt már így és van rá jobb megoldás, mint amit barkácsolni tudok.)

A csúszóablak nem azt jelenti, hogy feltétlenül az 1. rajtszámút cseréled le először.

Egyébként ha nem akarod kézzel erőltetni a magozást (így semmi se garantálja, hogy nem lesz egy magon több processz is, míg egy másikon egy se - de ez így van jól, csupán aláhúzom) még egyszerűbb a dolgod: nagyjából egy for, egy while, egy ps, egy sleep, egy wc és népi apró kell bele.

Én a grep -w ^cpu /proc/stat negyedik (idle) oszlopát figyelem, ha nőtt az idle egy sleep után, és ha igen, akkor indítok új processzt.

Ezt azért szeretem, mert mellette lehet használni a gépet (olyan feldolgozást futtatok, ami a folyamatos munka melletti úgymond hulladékidőben is futhat), a jelen esetben talán ennek is lehet értelme.

Hasonlo dolgon agyaltam, amikor a fenykepeimet konvertaltam hatterkeppe. Irtam egy szkriptet, ami a file-listabol gyartott egy

Makefile

-t, majd utana

make -j <cpuk-szama>

:-)

pexec. erre lett kitalalva ;) `apt-get install pexec`.

Ha a szkiptedet az mondjuk `./xyz.py files123.ext` formaban hivod, akkor vmi ilyesmi jo lehet:


$ pexec -n 4 -e file -r files*.ext -c -R -- './xyz.py $file'