Python Apscheduler не закрывается

У нас есть требование динамически планировать несколько заданий во время выполнения текущего задания.

Примерный сценарий:

Должен быть планировщик для ежедневного просмотра таблицы приложений (предположим, в 6:00 по всемирному координированному времени). Найдите пользователей, у которых сегодняшнее время datetime как возобновление_dttime Динамически запланируйте задание для этого пользователя и запустите его службу в это сегодняшнее возобновление_dttime Итак, мой код:

from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()

def scheduled_job():
    """
    """
    liveusers = todays_userslist() #Get users from table with todays resume_dttime
    for u in liveusers:
        user_job = get_userjob(u.id)
        runtime = u.resume_dttime #eg u.resume_dttime is datetime(2015, 12, 13, 16, 30, 5)
        sched.add_job(user_job, 'date', run_date=runtime, args=[u.name])


if __name__ == "__main__":
  scheduled_job()
  sched.start()
  sched.shutdown(wait=True)

Код работает хорошо (для одной работы). С несколькими заданиями не проверял, но вообще не останавливается. Я попытался удалить цикл for. Кроме того, мы просмотрели множество запросов на гугл. Но не повезло :( Чтобы выйти, мне каждый раз нужно выходить через CTrl+C


person Laxmikant    schedule 01.01.2016    source источник
comment
где кодовый блок? во время работы планировщика или до? Вы можете отправить трассировку вашего CTRL-C?   -  person Ali Nikneshan    schedule 01.01.2016
comment
Я не понимаю, почему блокировка не является предполагаемым поведением. Роль планировщика заключается в том, чтобы работать в фоновом режиме и время от времени запускать задание, я что-то упустил? cron - единственная альтернатива фоновому запуску для меня.   -  person Arthur Hv    schedule 01.01.2016


Ответы (1)


Он блокируется при запуске(), как указано в документации. говорит. Вызов start() вернется только в том случае, если планировщик будет закрыт из другого потока, чего вы нигде не делаете (судя по приведенному выше фрагменту).

person Alex Grönholm    schedule 02.01.2016
comment
Хорошо, спасибо, понял! Так что это никогда не придет в sched.shutdown(wait=True). Не могли бы вы показать мне пример, чтобы закрыть его через другой поток? - person Laxmikant; 02.01.2016
comment
Может быть, закрыть его с одной из ваших запланированных работ? Просто вызовите там sched.shutdown(). - person Alex Grönholm; 02.01.2016