Wie eine Funktion asynchron alle 60 Sekunden in Python ausführen?
-
19-09-2019 - |
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!
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)