Raghav
Raghav

Reputation: 161

Python schedule a function to run every few seconds

I am new using python and I have a python code that have 3 functions in it. i want to run these three function after every X number of seconds. I am using the APScheduler package and add_job method. I see a warning message saying "skipped: maximum number of running instances reached (1)" while i implement for one function. So, what will happen when i schedule all the three functions using add_job method?

Code looks something like this

  scheduler1 = APScheduler()
scheduler2 = APScheduler()
scheduler3 = APScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    scheduler1.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
    scheduler.start()
    scheduler2.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
    scheduler.start()
    scheduler3.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
    scheduler.start()

Using the above type of code, Can I achieve a scheduler that is running three jobs in the background and all of them run every 5 seconds?

Upvotes: 1

Views: 5970

Answers (2)

anarchy
anarchy

Reputation: 5204

Does this work?

import time

scheduler = APScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    while True:
        scheduler.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
        scheduler.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
        scheduler.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
        scheduler.start()
        time.sleep(20)

It should run forever until you press Ctrl+c

You can also try it like this

import time

scheduler = APScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")

scheduler.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
scheduler.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
scheduler.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
scheduler.start()

if __name__ == '__main__':
    while True:
        time.sleep(20)

This way you only add the jobs to the scheduler once and you run the start loop over and over again.

Upvotes: -1

Zain Ul Abidin
Zain Ul Abidin

Reputation: 2710

First of all there is nothing wrong with your code just the silly typing mistakes with object names and its obviously not optimized.

Following is the your version by fixing the typos

from apscheduler.schedulers.background import BackgroundScheduler
from time import sleep

scheduler1 = BackgroundScheduler()
scheduler2 = BackgroundScheduler()
scheduler3 = BackgroundScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    scheduler1.add_job(id='Scheduled task', func=fun1, trigger='interval', seconds=5)
    scheduler1.start()
    scheduler2.add_job(id='Scheduled task', func=fun2, trigger='interval', seconds=5)
    scheduler2.start()
    scheduler3.add_job(id='Scheduled task', func=fun3, trigger='interval', seconds=5)
    scheduler3.start()
    while True:
        sleep(1)

i added extra sleep function to stop the program from being killed and test whether or not timer is working, its working just fine

following version is the optimized form of your code

from apscheduler.schedulers.background import BackgroundScheduler
from time import sleep

scheduler = BackgroundScheduler()

def fun1():
  print("From Func1")

def fun2():
  print("From Func2")

def fun3():
  print("From Func3")


if __name__ == '__main__':
    scheduler.add_job(id='Scheduled task 1', func=fun1, trigger='interval', seconds=5)
    scheduler.add_job(id='Scheduled task 2', func=fun2, trigger='interval', seconds=5)
    scheduler.add_job(id='Scheduled task 3', func=fun3, trigger='interval', seconds=5)
    scheduler.start()
    while True:
        sleep(1)

using the single scheduler object to run all functions after specified period of time.

enter image description here

Upvotes: 4

Related Questions