APScheduler внутри объекта Class
Я пытаюсь внести свой вклад в проект Python на Github для сбора данных из FXCM, и у меня возникли некоторые проблемы с APScheduler внутри класса.
Ниже приведен фрагмент кода.
# director.py
from apscheduler.scheduler import Scheduler
class Director(object):
"""
Description
"""
class TimeKeeper(Director):
"""
Description
"""
def __init__(self):
sched = Scheduler()
def min_1(self):
td = 300
tf = 'm1'
print("TimeDelta: %s --- Time Frame: %s --- Event: 'GetLive' sent to queue") % (td, tf)
# other functions at different times
def start_timers(self):
self.sched.start()
self.sched.add_cron_job(self.min_1, minute='0-59')
Класс начинается с другого скрипта ниже:
# main.py
from director import TimeKeeper
if __name__ == "__main__":
"""
Description
"""
TimeKeeper().start_timers()
Проблема в том, что после выполнения скрипта он выполняется в течение доли секунды, а затем останавливается, ошибок трассировки нет.
Класс разработан неправильно или я пропускаю некоторые части кода? Помощь сообществ будет высоко ценится!
1 ответ
Формальный ответ на ваш вопрос заключается в том, что при использовании APScheduler v2 планировщик по умолчанию работает в многопоточном режиме, который будет возвращен сразу после применения .start()
:
https://github.com/agronholm/apscheduler/blob/2.1/apscheduler/scheduler.py
Поскольку он возвращается немедленно и ничто не поддерживает основной поток вашей программы, ваша программа завершается немедленно. Вы должны поддерживать свое программирование достаточно долго, чтобы планировщик мог инициировать событие, или вам нужно запускать с использованием блокирующей версии планировщика.
Для этой более старой версии APscheduler вам нужно работать в автономном режиме, если вы хотите, чтобы планировщик блокировал:
https://github.com/agronholm/apscheduler/blob/2.1/examples/interval.py
или вы, если хотите продолжить работу в многопоточном режиме:
https://github.com/agronholm/apscheduler/blob/2.1/examples/threaded.py
Более новые версии APScheduler имеют отдельные BlockingScheduler and
Классы BackgroundScheduler`а и вам следует ознакомиться с соответствующими примерами для обновленного API.