Santhosh Ram
Santhosh Ram

Reputation: 93

Schedule scripts continuously with time intervals

I'm trying to create a scheduler that triggers multiple scripts based on time. For example, I have scripts A,B and C and I want to trigger A-every 1 minute, B-Once in every 2 minutes, C-Once in every 3 minutes. For now, I'm just trying to get them printed on screen.

I've got the module Sched from Python and tried working with it. Unfortunately, the trigger doesn't work as expected. Upon modifications, it either works continuously but not triggering the right scripts or triggering all three scripts only once and exits from the flow.

Code that triggers only once:

import sched, time
from datetime import datetime

s = sched.scheduler(time.time, time.sleep)
def print_time(a='default'):
    print("From print_time", datetime.now().strftime("%H%M%S"), a)

def print_some_times():
    print("Start time :"+datetime.now().strftime("%H%M%S"))
    s.enter(18, 1, print_time, kwargs={'a': '3 Minutes Trigger'})
    s.enter(12, 1, print_time, kwargs={'a': '2 Minutes Trigger'})
    s.enter(6, 1, print_time, kwargs={'a': '1 Minute Trigger'})
    s.enter(6, 1, print_time, kwargs={'a': '1 Minute Trigger'})
    s.run()
    print("End time :"+datetime.now().strftime("%H%M%S"))

print_some_times()

Code that triggers continuously but incorrectly:

import sched, time
from datetime import datetime

s = sched.scheduler(time.time, time.sleep)
def print_time(a='default'): 
    s.enter(5, 1, print_time, ())  
    print("From print_time "+datetime.now().strftime("%H%M%S")+a)

def print_some_times():
    print("Start time :"+datetime.now().strftime("%H%M%S"))
    s.enter(18, 1, print_time, kwargs={'a': ' 3 Minutes Trigger'})
    s.enter(12, 1, print_time, kwargs={'a': '  2 Minutes Trigger'})
    s.enter(6, 1, print_time, kwargs={'a': '  1 Minute Trigger'})
    s.enter(6, 1, print_time, kwargs={'a': '  1 Minute Trigger'})       
    s.run()
    print("End time :"+datetime.now().strftime("%H%M%S"))

print_some_times()

Note: I've removed the 0s in time value of enter so that we don't have to wait long for the output.

Actual result with the first code:
Start time :163945
From print_time 163951 1 Minute Trigger
From print_time 163951 1 Minute Trigger
From print_time 163957 2 Minutes Trigger
From print_time 164003 3 Minutes Trigger
End time :164003

Expected output:
1 Minute Trigger should trigger every one minute
2 Minute trigger should trigger every two minutes and so on.

Upvotes: 1

Views: 66

Answers (1)

Adam.Er8
Adam.Er8

Reputation: 13393

the sched module is not designed for this.

you can try and use this schedule library instead.

install it using python3 -m pip install schedule

import schedule
import time
from datetime import datetime


def print_time(a='default'):
    print("From print_time " + datetime.now().strftime("%H%M%S") + a)


def print_some_times():
    print("Start time :" + datetime.now().strftime("%H%M%S"))
    schedule.every(3).minutes.do(print_time, a='  3 Minutes Trigger')
    schedule.every(2).minutes.do(print_time, a='  2 Minutes Trigger')
    schedule.every(1).minutes.do(print_time, a='  1 Minute Trigger')
    schedule.every(1).minutes.do(print_time, a='  1 Minute Trigger')
    print("End time :" + datetime.now().strftime("%H%M%S"))


print_some_times()

while 1:
    schedule.run_pending()
    time.sleep(1)

Upvotes: 1

Related Questions