1.安装
pip install schedule
2.官网使用demo
<span style="color: #0000ff;">def<span style="color: #000000;"> job():
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">I'm working...<span style="color: #800000;">"<span style="color: #000000;">)
schedule.every(10<span style="color: #000000;">).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at(<span style="color: #800000;">"<span style="color: #800000;">10:30<span style="color: #800000;">"<span style="color: #000000;">).do(job)
schedule.every(5).to(10<span style="color: #000000;">).minutes.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at(<span style="color: #800000;">"<span style="color: #800000;">13:15<span style="color: #800000;">"<span style="color: #000000;">).do(job)
schedule.every().minute.at(<span style="color: #800000;">"<span style="color: #800000;">:17<span style="color: #800000;">"<span style="color: #000000;">).do(job)
<span style="color: #0000ff;">while<span style="color: #000000;"> True:
schedule.run_pending()
time.sleep(1)
3.拓展:
1.并行执行任务
(1)默认情况下,schedule按顺序执行所有作业。这背后的原因是很难找到一个让每个人都开心的并行执行模型
<span style="color: #0000ff;">def<span style="color: #000000;"> job():
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">I'm running on thread %s<span style="color: #800000;">" %<span style="color: #000000;"> threading.current_thread())
<span style="color: #0000ff;">def<span style="color: #000000;"> run_threaded(job_func):
job_thread = threading.Thread(target=<span style="color: #000000;">job_func)
job_thread.start()
schedule.every(10<span style="color: #000000;">).seconds.do(run_threaded,job)
schedule.every(10<span style="color: #000000;">).seconds.do(run_threaded,job)
<span style="color: #0000ff;">while 1<span style="color: #000000;">:
schedule.run_pending()
time.sleep(1)
(2)如果需要控制线程数,就需要用queue
<span style="color: #0000ff;">def<span style="color: #000000;"> job():
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">I'm working<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> worker_main():
<span style="color: #0000ff;">while 1<span style="color: #000000;">:
job_func =<span style="color: #000000;"> jobqueue.get()
job_func()
jobqueue.task_done()
jobqueue =<span style="color: #000000;"> Queue.Queue()
schedule.every(10<span style="color: #000000;">).seconds.do(jobqueue.put,job)
schedule.every(10<span style="color: #000000;">).seconds.do(jobqueue.put,job)
worker_thread = threading.Thread(target=<span style="color: #000000;">worker_main)
worker_thread.start()
<span style="color: #0000ff;">while 1<span style="color: #000000;">:
schedule.run_pending()
time.sleep(1)
(3)抛出异常
<span style="color: #0000ff;">def catch_exceptions(cancel_on_failure=<span style="color: #000000;">False):
<span style="color: #0000ff;">def<span style="color: #000000;"> catch_exceptions_decorator(job_func):
@functools.wraps(job_func)
<span style="color: #0000ff;">def wrapper(*args,*<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">try<span style="color: #000000;">:
<span style="color: #0000ff;">return job_func(args,**<span style="color: #000000;">kwargs)
<span style="color: #0000ff;">except<span style="color: #000000;">:
<span style="color: #0000ff;">import<span style="color: #000000;"> traceback
<span style="color: #0000ff;">print<span style="color: #000000;">(traceback.format_exc())
<span style="color: #0000ff;">if<span style="color: #000000;"> cancel_on_failure:
<span style="color: #0000ff;">return<span style="color: #000000;"> schedule.CancelJob
<span style="color: #0000ff;">return<span style="color: #000000;"> wrapper
<span style="color: #0000ff;">return<span style="color: #000000;"> catch_exceptions_decorator
@catch_exceptions(cancel_on_failure=<span style="color: #000000;">True)
<span style="color: #0000ff;">def<span style="color: #000000;"> bad_task():
<span style="color: #0000ff;">return 1 /<span style="color: #000000;"> 0
schedule.every(5).minutes.do(bad_task)
(4)只运行一次
schedule.every().day.at(<span style="color: #800000;">'<span style="color: #800000;">22:30<span style="color: #800000;">').do(job_that_executes_once)
(5)一次取消多个任务
(schedule.every().day.do(greet,<span style="color: #800000;">'<span style="color: #800000;">Andrea<span style="color: #800000;">').tag(<span style="color: #800000;">'<span style="color: #800000;">daily-tasks<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">friend<span style="color: #800000;">'<span style="color: #000000;">)
schedule.every().hour.do(greet,<span style="color: #800000;">'<span style="color: #800000;">John<span style="color: #800000;">').tag(<span style="color: #800000;">'<span style="color: #800000;">hourly-tasks<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Monica<span style="color: #800000;">').tag(<span style="color: #800000;">'<span style="color: #800000;">hourly-tasks<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">customer<span style="color: #800000;">'<span style="color: #000000;">)
schedule.every().day.do(greet,<span style="color: #800000;">'<span style="color: #800000;">Derek<span style="color: #800000;">').tag(<span style="color: #800000;">'<span style="color: #800000;">daily-tasks<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">guest<span style="color: #800000;">'<span style="color: #000000;">)
schedule.clear(<span style="color: #800000;">'<span style="color: #800000;">daily-tasks<span style="color: #800000;">')
(6)在任务中加入日志功能
<span style="color: #0000ff;">import<span style="color: #000000;"> schedule
<span style="color: #008000;">#<span style="color: #008000;"> This decorator can be applied to
<span style="color: #0000ff;">def<span style="color: #000000;"> with_logging(func):
@functools.wraps(func)
<span style="color: #0000ff;">def wrapper(*args,*<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">'<span style="color: #800000;">LOG: Running job "%s"<span style="color: #800000;">' % func.<span style="color: #800080;">name<span style="color: #000000;">)
result = func(args,**<span style="color: #000000;">kwargs)
<span style="color: #0000ff;">print(<span style="color: #800000;">'<span style="color: #800000;">LOG: Job "%s" completed<span style="color: #800000;">' % func.<span style="color: #800080;">name<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> result
<span style="color: #0000ff;">return<span style="color: #000000;"> wrapper