2010-12-30 16 views
0

Ich habe über Python sched (Task-Schedular) gelesen, es funktioniert wie ein Cron.
aber ich habe eine Frage:Frage über Python sched schedular

  • kann sagen, wenn ich eine Funktion plane nach all 2 Stunden und in der Zwischenzeit Ryn meines System wird heruntergefahren, dann wieder das System neu starten, ich ... hat die Schedular startet automatisch und führt die Funktion nach 2 Stunden aus? oder muss ich das nach dem herunterfahren des systems noch einmal starten?

  • hat sched arbeiten wie ein Deamon?

+1

Haben Sie die Quelle für 'sched' gelesen? Es sind 135 Zeilen Code. Welcher Teil davon war schwer zu verstehen? –

+0

Ich bin Anfänger, also konnte nicht verstehen. Was ich fragen möchte, ist Turbogear sagt es asmini cron sie: http: //www.razorvine.net/download/kronos.py. aber es verwendet sched. Wie kann es dann Cron sein? – samy

Antwort

1

Antwort auf alle drei Fragen ist Kein.

sched unterscheidet sich von cron. Es benötigt eine generische Timer- oder Zählerfunktion und eine Verzögerungsfunktion und ermöglicht es Ihnen, einen Funktionsaufruf nach einer bestimmten Zeit (ein Ereignis wie von Ihrer generischen Timer-Funktion definiert) zu planen.

Es wird nicht ausgeführt, nachdem Sie Ihr Programm geschlossen haben, es sei denn, Sie verwalten den Status durch Schreiben in eine Datei oder db. Dies ist kompliziert und die Verwendung von Cron wäre besser.

sched arbeitet an Ereignissen, aber nicht am Hintergrund. Es ist also nicht genau ein Deamon, aber Sie können es deamonisieren, wenn Sie das Programm im Hintergrund laufen lassen.

+0

danke senthi. Aber wenn Sie in Turbogear http://docs.turbogears.org/TGScheduler sehen können, haben sie für die Planung verwendet. Wenn ich die geplante Funktion im Service behalte, funktioniert es auch nach dem Neustart? – samy

+0

wie es hier ist: http://www.razorvine.net/download/kronos.py – samy

+0

Kronos und TGScheduler sind höhere Abstraktionen zu den grundlegenden Prämissen von Planungsaufgaben. Die scheinen einige konkrete zeitbasierte Aufgaben zu definieren (wie den ersten Tag des Monats). Selbst wenn die App neu gestartet wird, funktionieren diese zwar, aber die Intervall-basierte Funktion funktioniert nicht (weil die Sitzung nicht gepflegt wird). Sie verzweigen den Lauf zu einer anderen Aufgabe, so dass sie als Prozess im Hintergrund läuft. Wie ich schon sagte, scheinen sie viel mehr zu verwenden (Betriebssystem bezogen, Threading und konkrete Ereignisse mit Datetime) als nur das Sched. –

0

und wenn dies so ist:
wird dies auch nach dem Systemneustart funktionieren?
Antwort ist: NEIN dann wie kann Turbogear Scheduler mit Cronos in Cron laufen? Geplante Ereignisse im Turbogear werden ebenfalls nach dem Neustart des Systems gelöscht.
Bitte korrigieren Sie mich, wenn ich falsch bin.

import time 
import sched 
import datetime 
import threading 
import calendar 
#from datetime import datetime 


class test: 

    def __init__(self): 
     self.name = '' 

    def getSec(self): 

     now = datetime.datetime.now() 
     print "now - ", now 
     currentYear = now.year 
     currentMonth = now.month 
     currentDay = now.day 
     currentHour = now.hour 
     currentMinute = now.minute 
     currentSecond = now.second 
     currentMicroseconds = now.microsecond 
     command = "python runbackup.py" 
     print "command is - ", command 

     print "currentMinute - ", currentMinute 
     print "currentSecond - ", currentSecond 
     # current time 
     a = datetime.datetime(currentYear, currentMonth, currentDay, currentHour, currentMinute, currentSecond, currentMicroseconds) 

     last_date_of_current_month = calendar.monthrange(currentYear, currentMonth)[1] 
     print "last_date_of_current_month - ", last_date_of_current_month 
     b = datetime.datetime(currentYear, currentMonth, int(last_date_of_current_month), 23, 59, 59, 000000) 
     #b = datetime.datetime(currentYear, currentMonth, int(29), 18, 29, 00, 000000) 
     #print "date time of b is - %s %s " % (18, 29) 

     c = b-a 
     print "c is - ", c 

     time.sleep(1) 
     scheduler = sched.scheduler(time.time, time.sleep) 
     #scheduler.cancel(e1) 
     sec = c.seconds 
     print "second - ", sec 
     print "scheduler entered." 
     e1 = scheduler.enter(sec, 1, self.getSec,()) 
     t = threading.Thread(target=scheduler.run) 
     print "thread started." 
     print "======================================" 
     t.start() 

     #scheduler.cancel(e1) 
     #print "canceled." 

     return True 

if __name__=='__main__' : 
    obj = test() 
    obj.getSec()