python 运行 apschedule BlockingScheduler 仅一次

python run apschedule BlockingScheduler only once

我正在使用 apscheduler 在另一个线程中以 10 分钟的间隔安排特定任务。这工作正常,我也可以在我在初始调度程序和其他任务中启动的记录器中提取这些信息。我现在的问题是当我试图只执行一次调度程序然后将它与应用程序一起终止时由于某种原因它不会发生并且应用程序似乎仍然 运行 (等待某事)因此没有exiting/terminating。下面是我正在使用的代码片段:

import os
import sys
import logging
from datetime import datetime
from subprocess import Popen, PIPE
from apscheduler.schedulers.blocking import BlockingScheduler

import recorder
import threading


def run_daily_sessions(thelogger):
    thelogger.info("[{}] - Trigger triggered".format(datetime.now()))
    thelogger.info("[{}] - Going to run daily scheduler script".format(datetime.now()))
    r = recorder.Recorder() # start recorder on another thread
    r.start()

    thelogger.info("[{}] - Ran daily scheduler script".format(datetime.now()))    

def main():
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    handler = logging.FileHandler('scheduler.log')
    handler.setLevel(logging.DEBUG)
    logger.addHandler(handler)
    logger.info("[{}] - scheduler.py was run".format(datetime.now()))

    sched = BlockingScheduler()
    logger.info("[{}] - blocking scheduler was created".format(datetime.now()))
    sched.add_job(run_daily_sessions, args=[logger])
    # sched.add_job(run_daily_sessions, 'interval', minutes=10, args=[logger])
    logger.info("[{}] - everyday task added, going to start the scheduler".format(datetime.now()))
    sched.start()
    # sched.shutdown()
    #logging.root.removeHandler(handler)
    return 0


if __name__ == '__main__':
    STATUS = main()
    print("terminating application!!!")
    sys.exit(STATUS)

我曾尝试将 max_instances=1 作为参数添加到 sched.add_job() 或添加 sched.shutdown(),但两者均无效。然后我认为这可能是由于记录器实例造成的,所以我尝试删除处理程序也没有成功。所以我试图理解为什么应用程序永远不会到达 print("terminating application!!!") 并退出,因为调度程序已经完成了他的任务或任何子任务。我在线程方面的经验有限,但我认为我已经按照网络上的一些示例正确地完成了一些事情,因此知道我可能做错了什么或遗漏了什么吗?


解法:

感谢@Alex Grönholm,他使用工作职能的反馈起到了作用。片段代码:

def terminate_scheduler(thesched, thelogger, should_exit=False):
    if should_exit:
        thelogger.info('[{}] - finished scheduler... going to exit'.format(datetime.now()))
        thesched.shutdown(wait=False)

def main():
...
...
...
    sched.add_job(run_daily_sessions, args=[logger])
    sched.add_job(terminate_scheduler, args=[sched, logger, {"should_exit": True}]) # add job function for terminating scheduler
...
...
    sched.start()
...
...
    return 0

if __name__ == '__main__':
    STATUS = main()
    print("terminating application!!!")
    sys.exit(STATUS)

您的印象似乎是调度程序一旦没有剩余的作业就应该自行终止。这是一个不正确的假设。如果你想关闭调度程序,你必须从另一个线程明确地这样做。