dbader / schedule

Python job scheduling for humans.
https://schedule.readthedocs.io/
MIT License
11.73k stars 959 forks source link

Schedules jobs too often if multiple threads are present #630

Open Klimroth opened 1 month ago

Klimroth commented 1 month ago

If I schedule two jobs and each job should be run in one thread, the following minimal example does not work

`import schedule import threading import time from datetime import datetime

def do_task_1() -> None: print(f"{datetime.now().isoformat()} - task 1 execution - thread {threading.current_thread().name} \n")

def do_task_2() -> None: print(f"{datetime.now().isoformat()} - task 2 execution - thread {threading.current_thread().name} \n")

def task_1_sheduler() -> None: schedule.every(10).seconds.do(do_task_1) while True: time.sleep(1) schedule.run_pending()

def task_2_sheduler() -> None: schedule.every(14).seconds.do(do_task_2) while True: time.sleep(1) schedule.run_pending()

def start_thread_1() -> None: t = threading.Thread(target=task_1_sheduler) t.start()

def start_thread_2() -> None: t = threading.Thread(target=task_2_sheduler) t.start()

start_thread_1() start_thread_2() `

I would expect it to conduct do_task_2 every 14 seconds on thread 2 and do_task_1 independently every 10 seconds on thread 1, but it mixes things up

image001

What am I doing wrong?

azhiv commented 1 month ago

I encountered the same problem - it turned out that the default scheduler is shared among all threads. If you create a dedicated scheduler scheduler = schedule.Scheduler() in each thread and use it there, the output will match what you expect.