3 votes

GNU Parallel et Python atexit

J'essayais d'exécuter un script python avec GNU parallel. Tout semble fonctionner, sauf la routine atexit utilisée à l'intérieur du script python. Il semble qu'après ctrl+c, parallel tue le processus python sans donner à python une chance d'appeler la routine atexit enregistrée. Comment faire pour que parallel soit un peu plus gentil envers les processus enfants ?

Voici un exemple pour montrer le comportement.

test_signal.py :

#!/usr/bin/env python3

import time
import sys
import atexit

def cleanup():
    print('cleanup called', flush=True)

atexit.register(cleanup)

time.sleep(60)
print('completed process', sys.argv[1])

Testé avec la commande :

chmod +x test_signal.py
./test_signal.py 1 # this works as expected when using ^C
parallel -j 4 ./test_signal.py {} ::: $(seq 1 12) # this one does not

3voto

Ole Tange Points 4907

GNU Parallel tue les travaux comme spécifié dans --termseq . Il s'agit d'une valeur par défaut :

TERM,200,TERM,100,TERM,50,KILL,25

Donc SIGTERM, attendre 200 ms, SIGTERM, attendre 100 ms, SIGTERM, attendre 50 ms, SIGKILL, attendre 25 ms. Si le processus meurt pendant l'attente, GNU Parallel ignore le reste de la séquence - pas besoin de tuer un cheval mort.

Changement --termseq aux signaux que vous voulez envoyer et au temps qui les sépare.

CTRL-C envoie un SIGINT, donc ça devrait marcher :

# Give 1 second to clean up, then kill
parallel --termseq INT,1000,KILL,25 ...

Sachez simplement que vous ne verrez pas le résultat si vous n'utilisez pas la fonction --ungroup .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X