Python - Apscheduler即使在使用' remove_job'之后也没有停止工作。

时间:2015-10-09 10:48:56

标签: python apscheduler

这是我的代码

我使用调度程序的remove_jobshutdown函数来停止作业,但它一直在执行。

停止执行任务的正确方法是什么?

from apscheduler.schedulers.background import BlockingScheduler

def job_function():
    print "job executing"


scheduler = BlockingScheduler(standalone=True)
scheduler.add_job(job_function, 'interval', seconds=1, id='my_job_id')


scheduler.start()
scheduler.remove_job('my_job_id')
scheduler.shutdown()

3 个答案:

答案 0 :(得分:8)

只需要让调度程序使用job_function删除remove_function内的作业@Akshay Pratap Singh正确指出,控件永远不会返回start()

from apscheduler.schedulers.background import BlockingScheduler

count = 0

def job_function():
    print "job executing"
    global count, scheduler

    # Execute the job till the count of 5 
    count = count + 1
    if count == 5:
        scheduler.remove_job('my_job_id')


scheduler = BlockingScheduler()
scheduler.add_job(job_function, 'interval', seconds=1, id='my_job_id')


scheduler.start()

答案 1 :(得分:5)

在使用BlockingScheduler时,首先要了解它的性质。

所以,基本上BlockingScheduler是一个在前台运行的调度程序(即 start()将阻止该程序)。在非专业术语中,它在前台运行,所以当你调用时 start(),呼叫永远不会返回。这就是为什么从未调用 start()后面的所有行的原因,因为您的调度程序从未停止过。

  
    

如果要将APScheduler用作独立的调度程序(例如,构建守护程序),则BlockingScheduler非常有用。

  

<强>解决方案

如果要在运行某些代码后停止调度程序,则应选择ApScheduler docs中列出的其他类型的调度程序。

我建议BackgroundScheduler,如果您希望调度程序在您的应用程序/程序中的后台运行,您可以暂停恢复在您需要时随时删除

答案 2 :(得分:0)

需要从另一个线程停止调度程序。调用scheduler.start()的线程被调度程序阻止。您在scheduler.start()之后编写的行是无法访问的代码。