Frage

Ich möchte eine Funktion alle 60 Sekunden auf Python ausführen, aber ich will nicht mittlerweile blockiert werden.

Wie kann ich es asynchron tun?

import threading
import time

def f():
    print("hello world")
    threading.Timer(3, f).start()

if __name__ == '__main__':
    f()    
    time.sleep(20)

Mit diesem Code wird die Funktion f alle 3 Sekunden innerhalb der 20 Sekunden time.time ausgeführt. Am Ende gibt es einen Fehler, und ich denke, dass es ist, weil die threading.timer nicht abgebrochen wurde.

Wie kann ich es rückgängig machen?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Sie können die threading.Timer Klasse versuchen: http: //docs.python .org / library / threading.html # Timer-Objekte .

import threading

def f(f_stop):
    # do something here ...
    if not f_stop.is_set():
        # call f() again in 60 seconds
        threading.Timer(60, f, [f_stop]).start()

f_stop = threading.Event()
# start calling f now and every 60 sec thereafter
f(f_stop)

# stop the thread when needed
#f_stop.set()

Andere Tipps

Es hängt davon ab, was Sie wollen tatsächlich in der Zwischenzeit zu tun. Themen sind die allgemeinste und am wenigsten bevorzugte Art und Weise, es zu tun; Sie sollten mit einem Gewinde der Probleme bewusst sein, wenn Sie es verwenden: nicht alle (nicht-Python-Code) ermöglicht den Zugriff von mehreren Threads gleichzeitig der Kommunikation zwischen Threads Thread-sicheren Datenstrukturen wie Queue.Queue getan werden soll, werden Sie nicht in der Lage sein, unterbrechen den Faden von außerhalb, und das Programm beendet wird, während der Faden noch kann läuft auf ein gesperrtes Interpreter oder unechte Rückverfolgungen führen.

Oft gibt es einen einfacheren Weg. Wenn Sie dies in einem GUI-Programm tun, verwenden Sie die Timer-GUI-Bibliothek oder Event-Funktionalität. Alle GUIs haben diese. Ebenso, wenn Sie ein anderes Ereignis System verwenden, wie Verdrehte oder einem anderen Server-Prozessmodell, sollten Sie in der Lage sein, in die Hauptereignisschleife einzuhaken, um es dazu führen, dass Funktion regelmäßig zu rufen. Die nicht-Threading Ansätze verursachen Ihr Programm blockiert werden, während die Funktion fehlt noch, aber nicht zwischen functioncalls.

Der einfachste Weg ist es, einen Hintergrund-Thread zu erstellen, die etwas alle 60 Sekunden läuft. Eine triviale Implementierung ist:

class BackgroundTimer(Thread):   
   def run(self):
      while 1:
        Time.sleep(60)
        # do something


# ... SNIP ...
# Inside your main thread
# ... SNIP ...

timer = BackgroundTimer()
timer.start()

Offensichtlich ist dies, wenn die „etwas tun“, um eine lange Zeit in Anspruch nimmt, müssen Sie es im Schlaf Aussage aufzunehmen. Aber dies dient als gute Näherung.

Ich googeln um und fand das Python Schaltungen Framework, das es möglich macht, zu warten
für ein bestimmtes Ereignis.

Die .callEvent(self, event, *channels) Verfahren von Schaltungen ein Feuer enthalten und Suspend-bis-Wirkungs-Funktionalität, die Dokumentation sagt:

  

Feuer das gegebene Ereignis auf die angegebenen Kanäle und Ausführung aussetzen   bis er geschickt worden. Diese Methode kann nur als geltend gemacht werden   Argument eine yield auf der oberen Ausführungsebene eines Handlers (z.B.   "yield self.callEvent(event)"). Es schafft effektiv und kehrt   ein Generator, der durch die Hauptschleife aufgerufen wird, bis das Ereignis hat   wurde versandt (siehe: func: circuits.core.handlers.handler).

Ich hoffe, Sie finden es so nützlich, wie ich tun :)
./regards

Wenn Sie die Methode aufrufen wollen „auf der Uhr“ (zum Beispiel jede Stunde auf der Stunde ), können Sie die folgende Idee integrieren mit welch auch immer Fädelmechanik Sie wählen:

import time

def wait(n):
    '''Wait until the next increment of n seconds'''
    x = time.time()
    time.sleep(n-(x%n))
    print time.asctime()

Ich denke, der richtige Weg, um einen Faden immer wieder ist die nächste auszuführen:

import threading
import time

def f():
    print("hello world")  # your code here
    myThread.run()

if __name__ == '__main__':
    myThread = threading.Timer(3, f)  # timer is set to 3 seconds
    myThread.start()
    time.sleep(10)  # it can be loop or other time consuming code here
    if myThread.is_alive():
        myThread.cancel()

Mit diesem Code wird die Funktion f alle 3 Sekunden innerhalb der 10 Sekunden time.sleep (10) ausgeführt. Am Ende läuft der Faden wird abgebrochen.

Warum müssen Sie nicht einen eigenen Thread erstellen, in dem Sie einen einfachen Schlaf Schleife setzen:

#!/usr/bin/env python
import time
while True:
   # Your code here
   time.sleep(60)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top