0
votes

Python - exécuter fonction après la quantité de temps?

Qu'est-ce que j'essaie de faire est d'imprimer ou d'exécuter une certaine chaîne après certain temps, dans le cas de cette fonction, il est 20 secondes, Le problème est sur la deuxième boucle, c'est sûr qu'il attend 20 secondes sur la première boucle, Mais la deuxième boucle, il n'attend plus, il ne cesse pas d'imprimer .. Pourquoi cela arrive-t-il? Et comment puis-je le résoudre? xxx


10 commentaires

L'indentation semble mal dans def Tess ()


Toute raison en utilisant le sommeil (20) ne fonctionnerait pas?


J'ai écrit une réponse mais j'ai réalisé que je ne comprends pas la logique. Il devrait exécuter la fonction toutes les 20 secondes, la minuterie étant réinitialisée après chaque exécution? Qu'est-ce que commence pour?


... Mais c'est votre question, si sûrement, vous comprenez ce que vous visez?


En avez-vous besoin d'imprimer toutes les 20 secondes ou une fois que 20 secondes sont écoulées? Parce que si vous avez besoin d'une sortie imprimée toutes les 20 secondes peut-être qu'un planificateur pourrait être un moyen facile de le faire?


start = time.time () semble inutile depuis Démarrer n'est jamais utilisé.


Cela semble de plus en plus comme une faute de frappe. startlog ! = Démarrer


Vous devez définir le StartLog global dans la fonction


Merci, oui, la variable globale résout, je n'y pensais pas.


Les variables globales sont une mauvaise pratique, en particulier dans ce contexte. En utilisant filetage / multiprocessionnaire est le moyen standard d'aller.


4 Réponses :


1
votes

Vous devez réinitialiser Startlog entre les appels vers Tess qui "réussissent" (ont passé 20 s), ce code fonctionne comme vous le souhaitez (mais est laide à cause des variables globales).

import time

startlog = time.time()

def tess():
    global startlog
    if time.time() - 20 > startlog:
        print('its been 20 secs')
        startlog = time.time()


tm = 0
while True:
    tm += 1
    print(tm)
    tess()
    time.sleep(1)


8 commentaires

J'ai utilisé ceci et il dit que Startlog est indéfini


@Redgartech sur quelle ligne?


Désolé de ne pas répondre plus tôt. Je suis incapable de répondre actuellement. J'ai exécuté le programme dans mon programme et cela ne fonctionnait pas comme un gestionnaire d'exception. Il y avait une liste d'erreurs comme une exception à mon programme.


@Redgartech On dirait que vous ne l'avez pas utilisé correctement, car "StartLog" est défini dans mon exemple (voir startlog = time.time () )


Yah ça n'a pas travaillé pour moi. Il a continué à dire que Startlog n'était pas défini.


@Redgartech en utilisant mon exacte code? Si oui, sur quelle ligne?


Seul, cela fonctionne simplement bien mais pas dans mon programme plus vaste comme une exception. Je voulais que ce soit juste comme ça seul comme une exception.


@Redgartech pour que le problème ne soit pas avec une solution, c'est que vous ne comprenez pas comment l'utiliser? Si je suis correct, veuillez poster une nouvelle question sur l'aide au lieu de commenter.



0
votes

Vous devez changer start = time.time () à startlog = hétrage () et définir une telle variable comme global ou non loCal : xxx

ou juste attendre 20 secondes: temps.sleep (20)


1 commentaires

Et définir le global car le début est sur une fonction



0
votes

Vous devez mettre à jour votre boucle intérieure de démarrage à l'intérieur de la fonction Tess (). Vous devez remplacer xxx

avec: xxx


0 commentaires

0
votes

On dirait que vous essayez de courir quelque chose pendant 20 secondes en arrière-plan, puis exécutez votre fonction.

Si tel est le cas, vous enfilez / multiprocessing a plus de sens. P>

Ce décorateur , votre code pourrait être réécrit comme p >

@time_limit(20)
def will_stop_after_20_secs():
    print ("doing stuff")
    time.sleep(20)


will_stop_after_20_secs()
print ("20 seconds had passed")


0 commentaires