Оба потока добавляют задачу к schedule
, и оба потока выполняют run_pending()
. Здесь может произойти то, что один поток выполняет run_pending()
, вызывая выполнение обеих запланированных задач, но до того, как run_pending()
завершит выполнение в первом потоке (и помечая отложенные задачи как выполненные), второй поток вступает в выполняет также run_pending()
, в результате чего любые отложенные задачи выполняются дважды.
Переместив блокировку из функции p
и поместив ее вокруг run_pending()
, я не смог повторить поведение запускаемых дважды задач.
def f(number):
schedule.every(5).seconds.do(p, number)
while True:
_lock.acquire()
schedule.run_pending()
_lock.release()
time.sleep(1)
Обратите внимание, что вы могли переписать программу так, чтобы только один поток вызывал run_pending()
, что-то вроде этого:
import threading
import time
from datetime import datetime
import schedule
def p(number):
print(number, datetime.now())
schedule.every(5).seconds.do(p, 1)
schedule.every(5).seconds.do(p, 2)
def task_runner():
while True:
schedule.run_pending()
time.sleep(1)
thread = threading.Thread(target=task_runner)
thread.start()
Это предполагает, что вы хотите использовать основной поток для чего-то другого, кроме выполнения запланированных задач. Или вы можете просто вызвать run_pending()
в событии вашего приложения l oop, не добавляя его в отдельный поток.