Python: recomandare mecanism process singleton

Salut,

Avem un cron care porneste la fiecare X minute un script Python.

Trebuie sa ne asiguram la momentul pornirii scriptului, daca este deja un proces sistem care ruleaza scriptul respectiv sa faca exit() noua instanta de script. Deci sa fie singleton procesul.

Am gasit diverse biblioteci care fac asta, dar vreau sa vad si care sunt recomandarile voastre venite din experienta.

Cel mai important e sa fie un mecanism robust, care face fata la crash-uri ale scriptului, reboot-uri hard ales sitemului etc.

Mă gândesc că un tool precum Supervisor ar avea grijă să țină mereu o instanță a acelui proces pornită + loguri de toate felurile. Să înțeleg că folosiți direct cron-ul din OS?

Later edit: se descurcă de minune să dirijeze procese dar nu este întocmai menit să înlocuiască un cron

2 Likes

Ma gandesc ca un fisier .lock ar merge
Am mai vazut scripturi care creeaza acest fisier cand sunt rulate. Daca fisierul exista, faci exit()

1 Like

Nu-mi plac cron-urile și, ori de câte ori am ocazia, le înlocuiesc cu o soluție bazată pe Gearman.

1 Like

Acum folosim cron pentru un proces. Avem in vedere si sa folosim Celery periodic tasks (folosim deja Celery in proiect).

asta este forma in care s-a tradus restrictia, dar care e esenta ei?
de obicei, restrictiile de felul asta sunt date de o concurenta pe anumite resurse.
eu obisnuiesc sa verific exclusivitatea asta prin verificarea acelei resurse care imi genereaza restrictia.

Cam asta e soluția cea mai simplă: fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) unde fd e un fișier deschis pentru scriere (ex: open('/var/myscript.lock', 'wb')). Fiindcă fd dispare la ieșirea procesului nu trebuie să îți faci griji ce se întâmplă dacă procesul moare brusc.

Operația este atomică deci nu are race condition ca și verificat existența unui fișier.

PS. Se presupune că sistemul de fișiere e normal, nu NFS sau ceva avion.

5 Likes

Scriptul face niste operatii de actualizare de consum/facturare, sa zicem.

Motivul pentru care ar trebuie sa fie singleton e ca s-ar bate mai multe procese pe aceleasi tabele, fara sa aduca vreun beneficiu, in schimb ar face sa dureze si mai mult procesele din cauza lock-urilor MySQL pe tabele.

File lock it is then. :slight_smile:

Side note: vom renunta si la cron-uri in favoare taskurilor Celery programate. Pentru ca folosim deja Celery si avem si operatii de retry, detalii stare task in UI pentru userii admin, vizibilitate pe care o vom extinde, de ex. cu log per task vizibil in UI. Din ce am vazut e pretabil foarte bine file lock-ul si din taskuri Celery.

Multumesc