2016-10-14 2 views
1

Когда я запускаю это, он ждет минуту, затем он печатает «Загорается», затем ждет две минуты и печатает «Свет выключен». После этого apscheduler, кажется, сходит с ума и быстро чередует между двумя очень быстро.Почему это не работает? Является ли это ошибкой apscheduler?

Я только что наткнулся на ошибку apscheduler или почему это произошло?

from datetime import datetime, timedelta 
import time 
import os, signal, logging 
logging.basicConfig(level=logging.DEBUG) 

from apscheduler.schedulers.background import BackgroundScheduler 
scheduler = BackgroundScheduler() 


def turn_on(): 
    #Turn ON 
    print('##############################Lights on') 


def turn_off(): 
    #Turn off 
    print('#############################Lights off') 


def schedule(): 
    print('Lights will turn on at'.format(lights_on_time)) 
if __name__ == '__main__': 

    while True: 
     lights_on_time = (str(datetime.now() + timedelta(minutes=1))) 
     lights_off_time = (str(datetime.now() + timedelta(minutes=2))) 

     scheduler.add_job(turn_on, 'date', run_date=lights_on_time) 
     scheduler.add_job(turn_off, 'date', run_date=lights_off_time) 
     try: 
      scheduler.start() 
      signal.pause() 
     except: 
      pass 

    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C')) 

    try: 
     # This is here to simulate application activity (which keeps the main thread alive). 
     while True: 
      time.sleep(2) 
    except (KeyboardInterrupt, SystemExit): 
     # Not strictly necessary if daemonic mode is enabled but should be done if possible 
     scheduler.shutdown() 
+0

Я не знаком с пакетом, но так как вы планируете абсолютное время - здесь нет сюрпризов – volcano

+0

У меня все еще возникают проблемы с этим скриптом. Он проходит через один цикл, и я продолжаю получать сообщения об ошибках запуска. Есть идеи? TIA –

ответ

2

Вы наводняете планировщик событиями. Вы используете BackgroundScheduler, что означает, что scheduler.start() выходит и не ждет события. Самое простое исправление может состоять в том, чтобы не использовать BackgroundScheduler (используйте BlockingScheduler) или поставить sleep (180) в ваш цикл.

+0

Я использовал с помощью BlockingScheduler и спал, и я до сих пор не могу заставить это работать. –

+0

@GabrielMoreno Можете ли вы предоставить более подробную информацию о том, почему он не работает? –

+0

@GabrielMoreno Пробовал ли вы использовать 'job = scheduler.add_job (myfunc, 'interval', minutes = 2)'. См. Документы [здесь] (http://apscheduler.readthedocs.io/en/latest/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler.add_job). Вам нужно будет сделать это только один раз и не использовать цикл while. –

1

Попробуйте это:

from datetime import datetime, timedelta 
from apscheduler.schedulers.background import BackgroundScheduler 
import time 

scheduler = BackgroundScheduler() 


def turn_on(): 
    print('Turn on', datetime.now()) 


def turn_off(): 
    print('Turn off', datetime.now()) 


scheduler.start() 


while True: 
    scheduler.add_job(func=turn_on, trigger='date', next_run_time=datetime.now() + timedelta(minutes=1)) 
    scheduler.add_job(func=turn_off, trigger='date', next_run_time=datetime.now() + timedelta(minutes=2)) 
    time.sleep(180) 

Вы должны начать только планировщик один раз.

+0

Это работает, спасибо за помощь. –

Смежные вопросы