Faire cela à partir d'un gestionnaire de signaux est dangereux : vous pourriez vous trouver dans un gestionnaire d'exception au moment où l'exception est levée, et laisser les choses dans un état cassé. Par exemple,
def function_with_enforced_timeout():
f = open_temporary_file()
try:
...
finally:
here()
unlink(f.filename)
Si votre exception est levée ici(), le fichier temporaire ne sera jamais supprimé.
La solution serait que les exceptions asynchrones soient reportées jusqu'à ce que le code ne soit pas à l'intérieur d'un code de gestion des exceptions (un bloc except ou finally), mais Python ne le fait pas.
Notez que cela n'interrompra rien pendant l'exécution du code natif ; cela ne l'interrompra qu'au retour de la fonction, donc cela peut ne pas aider ce cas particulier. (SIGALRM lui-même pourrait interrompre l'appel qui se bloque - mais le code socket se contente généralement de réessayer après un EINTR).
Il est préférable de le faire avec des threads, car c'est plus portable que les signaux. Puisque vous démarrez un fil de travail et bloquez jusqu'à ce qu'il se termine, il n'y a aucun des problèmes habituels de concurrence. Malheureusement, il n'existe aucun moyen de transmettre une exception de manière asynchrone à un autre thread en Python (d'autres API de threads peuvent le faire). Il y aura également le même problème avec l'envoi d'une exception pendant un gestionnaire d'exception, et nécessitera la même correction.
0 votes
Duplicata possible de Timeout sur un appel de fonction