2011-06-13 4 views
0

Je n'arrive pas à trouver comment procéder. J'essaie d'exécuter un script Python pour une durée définie. Et chaque 1/10 de la durée j'en ai besoin pour faire quelque chose. Le problème est que cette étape peut prendre un certain temps à compléter. Je ne peux pas dépasser la durée maximale définie au départ.Problème de temps Python

Exemple: Durée 20 heures

Intervalle = 20/10 = 2 heures (Cela peut changer si elle doit)

Toutes les deux heures, il exécute la fonction(). function() prend entre 0-60 minutes pour terminer. Et puis ça dort. Comment puis-je faire en sorte qu'il continue à courir 9 fois plus, mais ne dépasse pas la durée maximale?

+1

Par exemple, démarrez-le dès le début et vérifiez-le simplement quand vous en avez besoin. –

+1

Vous pouvez vérifier 'signal.alarm' pour utiliser les signaux. De cette façon, un SIGALRM est généré sur un intervalle donné, et vous pouvez configurer votre gestionnaire de signal pour appeler 'function'. Consultez également 'signal.setitimer'. –

Répondre

2

Peut-être pouvez-vous utiliser des signaux. L'idée est de définir un gestionnaire de signal pour être appelé lorsqu'un SIGALRM est généré. Dans le gestionnaire de signal, vous pouvez appeler function. Ensuite, vous réinitialisez l'alarme et recommencez. Ceci est un exemple de base juste pour vous donner une idée.

import signal 
... 
signal.signal(signal.SIGALRM, alarm_handler) # set the signal handler 
signal.alarm(interval)      # set the alarm 
... 
def alarm_handler(signum, stack): 
    # call function 
    function() 

Une fois que l'alarme se déclenche, vous appelez function() puis réinitialiser l'alarme:

signal.signal(signal.SIGALRM, alarm_handler) 
signal.alarm(interval) 

Ou vous pouvez utiliser signal.setitimer pour mais je ne sais pas comment cela configurer automatiquement des alarmes d'intervalle, travailler avec grands délais (son utilisé pour les microsleeps).

REMARQUE: Vous devez appeler signal.alarm() à partir du thread principal.

0

Enfoncez un sous-processus pour effectuer le travail en cours; tuez le travail s'il dépasse votre limite d'exécution. Pourquoi ne pas simplement utiliser la minuterie globale?