6 Stimmen

Wie man ein Ereignis in Python ohne Multithreading planen?

Ist es möglich, ein Ereignis in Python ohne Multithreading zu planen? Ich versuche, etwas wie die Planung einer Funktion zu erhalten, die alle x Sekunden ausgeführt wird.

5voto

eumiro Punkte 193562

Vielleicht Zeitplan ?

4voto

Noufal Ibrahim Punkte 68934

Sie könnten eine Kombination aus signal.alarm und ein Signalhandler für SIGALRM so, dass die Funktion alle 5 Sekunden wiederholt wird.

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)

Die andere Möglichkeit ist die Verwendung der Zeitplan Modul, das mit Python mitgeliefert wird, aber ich weiß nicht, ob es Threads verwendet oder nicht.

2voto

inspectorG4dget Punkte 103745

Wie @eumiro anmerkt, ist der Zeitplan wahrscheinlich der richtige Weg. Wenn Sie das jedoch nicht tun wollen, können Sie dies tun:

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

2voto

Ondrej Vencovsky Punkte 2488

Ohne Threading macht es nur selten Sinn, eine Funktion periodisch aufzurufen. Denn Ihr Hauptthread ist durch das Warten blockiert - er tut einfach nichts. Wenn Sie es aber wirklich wollen, können Sie es tun:

import time

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

Ist es das, was Sie wirklich wollen?

2voto

hughdbrown Punkte 45214

Sie könnten verwenden Staudensellerie :

Celery ist ein quelloffener asynchroner Aufgaben-Warteschlange/Auftragswarteschlange basierend auf verteilter Nachrichtenübermittlung. Sie ist auf Echtzeitbetrieb ausgerichtet, aber unterstützt aber auch Scheduling.

T e Arbeitsknoten ausgeführt. Tasks können asynchron (im Hintergrund) oder synchron (warten, bis sie bereit sind).

und ein Codebeispiel:

Sie wollen wahrscheinlich etwas Code von sehen, deshalb hier eine Beispielaufgabe zum Addieren zwei Zahlen:

from celery.decorators import task

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

Sie können die Aufgabe in der Hintergrund ausführen oder warten, bis sie beendet ist:

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

Dies ist jedoch von allgemeinerer Bedeutung, als es das von Ihnen beschriebene Problem erfordert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X