Python调度程序未停止函数执行

Python调度程序未停止函数执行,python,flask,scheduled-tasks,apscheduler,Python,Flask,Scheduled Tasks,Apscheduler,我正在尝试执行人脸检测功能,并使用Apscheduler仅在特定时间之间运行该功能。我可以正确启动该功能,但end\u time参数似乎根本不起作用,该功能一直运行,直到手动关闭 以下是开始计划的路线: @app.route("/schedule/start", methods = ['POST']) def create(): sched = BlockingScheduler() sched.add_job(detection, '

我正在尝试执行人脸检测功能,并使用Apscheduler仅在特定时间之间运行该功能。我可以正确启动该功能,但
end\u time
参数似乎根本不起作用,该功能一直运行,直到手动关闭

以下是开始计划的路线:

@app.route("/schedule/start", methods = ['POST'])
    def create():
        sched = BlockingScheduler()
        sched.add_job(detection, 'cron', start_date='2020-10-01 15:33:00', end_date='2020-10-01 15:33:05')

    sched.start()


    return 'Schedule created.'
在我的
检测
-函数中有一个
While True
条件,所有的检测逻辑都在其中运行。这就是为什么即使我已经确定了停止时间,它也不会停止的原因吗?如何解决此问题

编辑。While-从my
检测循环
-功能(删除不必要的部分):

编辑2。我按照下面的建议进行了尝试,但出现了以下错误:
TypeError:func必须是可调用的或对其的文本引用

我还想集成手动启动和停止人脸检测功能的功能。我可以这样做:

@app.route("/start", methods = ['POST'])
def start():
    os.environ['run'] = 'running'
    detection()

    return 'Detection started'


@app.route("/stop", methods = ['POST'])
def stop():
    os.environ['run'] = 'stop'    

    return 'Detection stopped.'
然后在我的
detection.py
中,我只是在while循环的开头检查环境变量:

while True:
        if os.environ.get('run') == 'stop':
            stream.stream.release()
            exit()
我想要的是将调度功能集成到这个系统中。我不想做单独的函数,因为我希望能够手动停止按计划开始的检测。有什么建议我可以做到这一点吗

编辑3。日程安排正在进行中。手动启动也起作用,停止也起作用,即停止检测面。虽然以schedule启动的函数仍在运行,但它根本不会迭代到检测部分,因为有一个
os.environ['run']='stop'
-标志。知道如何停止函数执行吗? 这是我的while-loop检查:

while True:
    if self.end_date <= datetime.now() or os.environ.get('run') == 'stop':
        stream.stream.release()
        exit()
为True时:

如果self.end_date您需要一些条件来结束while循环,因为它现在是无限的,请传递开始/结束时间并转换为日期时间,然后尝试匹配
while end_date_time=
,然后退出任务。如果您需要传递开始/结束日期,可以将您的
检测
函数转换为类,并在初始化时传递
结束日期
,以停止cron作业

#detection.py
从日期时间导入日期时间
类别检测:
定义起始日期(自我、结束日期):
self.end_date=datetime.strtime(end_date,“%Y-%m-%d%H:%m:%S.%f”)
def检测(自):
打印(自我结束日期)

while self.end_date您能否在
检测方法中的
while True
上共享代码片段?当然,请将其编辑到我的问题中。结束时间只是有效负载(重新)启动的最晚时间。函数不是停止的时候,Python中的泛型中没有这样的东西。我对Apscheduler的理解是,它应该在满足
end\u date
参数时停止执行。你能检查一下我的第二次编辑从我原来的职位?我很想听听你对此有什么想法。我得到这个错误:
TypeError:func必须是一个可调用的或对其中一个的文本引用
@ir\u optim,我已经更新了代码示例,现在检查一下谢谢。用小的改动就可以了。你能看看我的编辑3从原来的职位,如果你有一些提示手动停止,我想听到他们@lr_optim在while循环中,您在路由中设置了
os.environ.get('running_flag')='stop'
,而在路由中设置了
os.environ['run']='stop'
,所以
running_flag!=运行
,这可能是问题所在,因为当循环尝试获取
os.environ.get('running_flag')
时,
检测
,如果未设置它,则它是
None
,因此您尝试比较
None='stop'
,它总是
False
。看起来像route
end()
cron作业
不共享相同的环境变量。您需要找到一种方法,将
run='stop'
传递到
检测
,而无需使用
os.environ
while True:
    if self.end_date <= datetime.now() or os.environ.get('run') == 'stop':
        stream.stream.release()
        exit()