2016-07-03 50 views
1

Ich habe über Threading gelesen und versucht, es in meinen Code zu implementieren, aber ich bin mir nicht sicher, ob die Art, wie ich es tue, die beste Praxis ist.Python Threading-Timer mit Paket

Mein Code importiert einfach ein Self-Scripted-Paket, das Wetterdaten abruft und das Paket danach alle 60 Sekunden startet.

Ich plane die Ausführung mehrerer Pakete, die Daten auf einmal sammeln, wenn ich eine gute Codetechnik ausgearbeitet habe.

from package.weather import weatherapi 
import threading 

def update(): 
    weatherapi() 
    threading.Timer(60, update).start() 

update() 
  1. Erstens scheint es nur chaotisch und wenn ich mehr Pakete laufen in einem Thread wollte, würde ich zweitens eine andere Update-Funktion
  2. erstellen müssen Ich bin nicht in der Lage zu meinen Prozess
zu töten

Wenn jemand irgendwelche Vorschläge hat, würde es sehr geschätzt werden.

+0

Warum nicht einfach 'time.sleep' für die Verzögerung verwenden? BTW, wenn Sie einen Prozess beenden möchten, ohne alle Threads zu löschen, setzen Sie ihr Flag 'daemon' auf' True', bevor Sie sie starten. – MisterMiyagi

+0

Siehe auch: http://stackoverflow.com/q/3393612/1025391 – moooeeeep

Antwort

0

Dies ist eine wirklich schlechte Verwendung von Threading.timer. Du startest ständig neue Threads, wenn du nur einen Thread regelmäßig etwas tun willst. Dieser Code ist gleichbedeutend:

Da Threads alle denselben Namespace verwenden, können Sie auch mit nur einer Funktion auskommen.

UPDATE_CALLABLES = [weatherapi] # add new functions to have them called by update 
def update(): 
    while True: 
    for func in UPDATE_CALLABLES: 
     func() 
    time.sleep(60) 

Beachten Sie, dass UPDATE_CALLABLES können auch angehängt werden, während der Thread bereits ausgeführt wird.

0

Eine Klasse wie das tut, was Sie wollen:

import threading 

class Interval: 
    def __init__(self): 
     self.api=[] 
     self.interval=60 
     self.timer=self 

    def set_api(self,api): 
     self.api=api 
    def set_interval(self,interval): 
     self.interval=interval 
    def cancel(self): 
     pass 
    def stop(self): 
     self.timer.cancel() 

    def update(self): 
     for api in self.api: 
      api() 
     self.timer = threading.Timer(self.interval,self.update).start() 

# Create instance and start with default parameters 
interval=Interval() 
interval.update() 

# Later on change the list of items to call 
interval.set_api([thisApi,thatApi]) 

# Later on still change the interval between calls 
interval.set_interval(30) 

# When you have had enough, cancel the timer 
interval.stop() 

Beachten Sie, dass es noch einen neuen Thread für jedes Intervall erzeugt zeitlich, aber Sie können die Liste der Anrufe jederzeit und stoppen es bei Wiederholung gemacht ändern Jederzeit.