Reputation: 161
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
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
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.
Upvotes: 4