2010-10-20 4 views

Répondre

4

Peut-être sched?

+0

Cela ressemble à être exactement ce que je cherche, merci. – relima

+1

Si c'est exactement ce que vous cherchez, appuyez sur le bouton I-Love-Your-Answer. – hughdbrown

2

Vous pouvez utiliser une combinaison de signal.alarm et un gestionnaire de signal pour SIGALRM comme si répéter la fonction toutes les 5 secondes.

import signal 

def handler(sig, frame): 
    print "I am done this time" 
    signal.alarm(5) #Schedule this to happen again. 

signal.signal(signal.SIGALRM, handler) 

signal.alarm(5) 

L'autre option est d'utiliser le module sched qui vient avec Python, mais je ne sais pas si elle utilise des threads ou non.

2

Serv est probablement la voie à suivre pour cela, comme @eumiro souligne. Toutefois, si vous ne voulez pas faire cela, alors vous pouvez le faire:

import time 
while 1: 
    #call your event 
    time.sleep(x) #wait for x many seconds before calling the script again 
+1

Est-ce ce que vous voulez? Cela bloquerait votre application pour 'x' secondes ne lui permettant complètement de rien faire. –

1

Sans filetage il est rarement judicieux d'appeler périodiquement une fonction. Parce que votre thread principal est bloqué par l'attente - il ne fait simplement rien. Toutefois, si vous voulez vraiment faire:

import time 

for x in range(3): 
    print('Loop start') 
    time.sleep(2) 
    print('Calling some function...') 

Je ce que vous voulez vraiment?

+0

Je suis assez sûr que ce n'est pas ce qu'il voulait. :) –

2

Vous pouvez utiliser celery:

Céleri est asynchrone open source file d'attente de tâches/file d'attente de travail basé sur un message distribué passe. Il est axé sur le fonctionnement en temps réel, mais soutient la planification ainsi.

Les unités d'exécution, appelées tâches, sont exécutées simultanément sur un ou plusieurs noeuds de travail . Les tâches peuvent exécuter de manière asynchrone (en arrière-plan) ou synchrone (attendez que prêt).

et un exemple de code:

Vous voulez probablement voir le code par maintenant, voici donc un exemple de tâche en ajoutant deux numéros:

from celery.decorators import task 

@task 
def add(x, y): 
    return x + y 

Vous peut exécuter la tâche en arrière-plan , ou attendre qu'elle se termine:

>>> result = add.delay(4, 4) 
>>> result.wait() # wait for and return the result 8 

Ceci est d'une utilisation plus générale que le problème que vous décrivez nécessite, cependant.

+0

@Noufal Ibrahim: Merci pour la capture.Je n'ai pas remarqué que lorsque j'ai coupé et collé le code du site céleri que la partie '@ tâche' a été mal formatée. – hughdbrown

+0

De rien Hugh. –

Questions connexes