2015-10-09 5 views
1

Это мой кодPython - Apscheduler не останавливая работу даже после того, как с помощью «remove_job»

Я использую remove_job и shutdown функции планировщика, чтобы остановить работу, но он продолжает выполняться.

Каков правильный способ остановить выполнение задания?

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() 

ответ

4

Просто попросите планировщик, чтобы удалить работу внутри 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() 
5

Как вы используете BlockingScheduler, так что сначала вы знаете, что это его природа.

Таким образом, в основном BlockingScheduler планировщик, который работает на переднем плане (т.е. старт() будет блокировать программу) .В миряне термины, он работает на переднем плане, так что, когда вы звоните старт(), вызов никогда не возвращается. Вот почему все строки, за которыми следуют start(), никогда не вызываются, из-за чего ваш планировщик никогда не останавливается.

BlockingScheduler может быть полезно, если вы хотите использовать APScheduler как автономный планировщик (например, для создания демона).


Решение

Если вы хотите остановить планировщик после запуска какого-то кода, то вы должны выбрать для других типов планировщика, перечисленных в ApSchedulerdocs.

Я рекомендую BackgroundScheduler, если вы хотите, планировщик для запуска в фоновом режиме внутри приложения/программы, которые вы можете пауза, резюме и удалить в любое время, когда вам это нужно.

+0

Код вообще не выполняет ни одного задания при использовании BackgroundScheduler таким образом -> http://pastebin.com/xDAJAXvT Что я делаю неправильно? – wolfgang

+0

С BackgroundScheduler, start() не блокирует ваш основной скрипт ENDS, эффективно останавливая ваше приложение. Конечно, вы не хотите останавливать работу сразу после запуска планировщика, так что же здесь сценарий реального мира? –

+0

@ AlexGrönholm Я просто хочу запланировать работу, выполняющую каждый интервал, даже если главный скрипт заканчивается. Я хотел бы прекратить работу в связанной с ней функции – wolfgang

0

нужен планировщик должен быть остановлен от другого нить. Поток, в котором вызывается scheduler.start(), блокируется планировщиком. Строки, которые вы написали после scheduler.start(), являются недостижимым.

+0

, пожалуйста, уточните, какое добавочное объявление добавлено этой записью от других. – Raju