商都县 顺昌县 万州区 宝坻区 昌都县 赫章县 延庆县 太保市 柞水县 湾仔区 石屏县 雷州市 丰城市 开鲁县 彰化市 霞浦县

当前位置:新选组>荆棘鸟

反击

标签:睡着觉 单机斗地主3.91

书名:调解面对面|作者:笑无语|本书类别:古言|更新时间:2019-08-25 00:36:43|字数:3896字

1.安装  

pip install apscheduler

  

  安装完毕

2.简单任务

  首先,来个最简单的例子,看看它的威力。

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 import datetime
 4 
 5 
 6 def aps_test():
 7     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "你好"
 8 
 9 
10 scheduler = BlockingScheduler()
11 scheduler.add_job(func=aps_test, trigger="cron", second="*/5")
12 scheduler.start()

  看代码,定义一个函数,然后定义一个scheduler类型,添加一个job,然后执行,就可以了,代码是不是超级简单,而且非常清晰。看看结果吧。

5秒整倍数,就执行这个函数,是不是超级超级简单?对了,apscheduler就是通俗易懂。

再写一个带参数的。

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 import datetime
 4 
 5 
 6 def aps_test(x):
 7     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
 8 
 9 scheduler = BlockingScheduler()
10 scheduler.add_job(func=aps_test, args=("你好",), trigger="cron", second="*/5")
11 scheduler.start()

结果跟上面一样的。

好了,上面只是给大家看的小例子,我们先从头到位梳理一遍吧。apscheduler分为4个模块,分别是Triggers,Job stores,Executors,Schedulers.从上面的例子我们就可以看出来了,triggers就是触发器,上面的代码中,用了cron,其实还有其他触发器,看看它的源码解释。

The ``trigger`` argument can either be:
          #. the alias name of the trigger (e.g. ``date``, ``interval`` or ``cron``), in which case any extra keyword
             arguments to this method are passed on to the trigger"s constructor
          #. an instance of a trigger class

看见没有,源码中解释说,有date, interval, cron可供选择,其实看字面意思也可以知道,date表示具体的一次性任务,interval表示循环任务,cron表示定时任务,好了,分别写个代码看看效果最明显。

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 import datetime
 4 
 5 
 6 def aps_test(x):
 7   我亲爱的小冤家_2018年最新新闻网  print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
 8 
 9 scheduler = BlockingScheduler()
10 scheduler.add_job(func=aps_test, args=("定时任务",), trigger="cron", second="*/5")
11 scheduler.add_job(func=aps_test, args=("一次性任务",), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=12))
12 scheduler.add_job(func=aps_test, args=("循环任务",), trigger="interval", seconds=3)
13 
14 scheduler.start()

看看结果

其实应该不用我解释代码,大家也可以看出结果了,非常清晰。除了一次性任务,trigger是不要写的,直接定义next_run_time就可以了,关于date这部分,官网没有解释,但是去看看源码吧,看这行代码。

 1     def _create_trigger(self, trigger, trigger_args):
 2         if isinstance(trigger, BaseTrigger):
 3             return trigger
 4         elif trigger is None:
 5             trigger = "date"
 6         elif not isinstance(trigger, six.string_types):
 7             raise TypeError("Expected a trigger instance or string, got %s instead" % trigger.__class__.__name__)
 8 
 9         # Use the scheduler"s time zone if nothing else is specified
10         trigger_args.setdefault("timezone", self.timezone)
11 
12         # Instantiate the trigger class
13         return self._create_plugin_instance("trigger", trigger, trigger_args)

第4行,如果trigger为None,直接定义trigger为"date"类型。其实弄到这里,大家应该自己拓展一下,如果实现web的异步任务。假设接到一个移动端任务,任务完成后,发送一个推送到移动端,用date类型的trigger完成可以做的很好。

3.爱探险的朵拉_2018年最新新闻网

  好了,scheduler的基本应用,我想大家已经会了,但这仅仅只是开始。如果代码有意外咋办?会阻断整个任务吗?如果我要计算密集型的任务咋办?下面有个代码,我们看看会发生什么情况。

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 import datetime
 4 
 5 
 6 def aps_test(x):
 7     print 1/0
 8     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
 9 
10 scheduler = BlockingScheduler()
11 scheduler.add_job(func=aps_test, args=("定时任务",), trigger="cron", second="*/5")
12 
13 scheduler.start()

还是上面代码,但我们中间故意加了个错误,看看会发生什么情况。

说我们没有log文件,好吧,我们添加一个log文件,看看写的什么画江湖之杯莫停_2018年最新新闻网

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 import datetime
 4 import logging
 5 
 6 loggi太古神王_2018年最新新闻网ng.basicConfig(level=logging.INFO,
 7                     format="%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s",
 8                     datefmt="%Y-%m-%d %H:%M:%S",
 9                     filename="log1.txt",
10                     filemode="a")
11 
12 
13 def aps_test(x):
14     print 1/0
15     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
16 
17 scheduler = BlockingScheduler()
18 scheduler.add_job(func=aps_test, args=("定时任务",), trigger="cron", second="*/5")
19 scheduler._logger = logging
20 scheduler.start()
View Code

终于可以看到了,这时候才看到错误,这个是一定要注意的。

其实,到这里,完全可以执行大多数任务了,但我们为了效率,安全性,再往下面看看,还有什么。

4.删除任务

假设我们有个奇葩任务,要求执行一定阶段任务以后,删除某一个循环任务,其他任务照常进行。有如下代码:

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 import datetime
 4 import logging
 5 
 6 logging.basicConfig(level=logging.INFO,
 7                     format="%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s",
 8                     datefmt="%Y-%m-%d %H:%M:%S",
 9                     filename="log1.txt",
10                     filemode="a")
11 
12 
13 def aps_test(x):
14     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
15 
16 
17 def aps_date(x):
18     scheduler.remove_job("interval_task")
19     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
20     
21 
22 scheduler = BlockingScheduler()
23 scheduler.add_job(func=aps_test, args=("定时任务",), trigger="cron", second="*/5", id="cron_task")
24 scheduler.add_job(func=aps_date, args=("一次性任务,删除循环任务",), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=12), id="date_task")
25 scheduler.add_job(func=aps_test, args=("循环任务",), trigger="interval", seconds=3, id="interval_task")
26 scheduler._logger = logging
27 
28 scheduler.start()
View Code

看看结果,

在运行过程中,成功删除某一个任务,其实就是为每个任务定义一个id,然后remove_job这个id,是不是超级简单,直观?那还有什么呢?

5.停止任务,恢复任务

看看官方文档,还有pause_job, resume_job,用法跟remove_job一样,这边就不详细介绍了,就写个代码。

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 import datetime
 4 import logging
 5 
 6 logging.basicConfig(level=logging.INFO,
 7                     format="%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s",
 8                     datefmt="%Y-%m-%数码宝贝_2018年最新新闻网d %H:%M:%S",
 9                     filename="log1.txt",
10                     filemode="a")
11 
12 
13 def aps_test(x):
14     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
15 
16 
17 def aps_pause(x):
18     scheduler.pause_job("interval_task")
19     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
20 
21 
22 def aps_resume(x):
23     scheduler.resume_job("interval_task")
24     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
25 
26 scheduler = BlockingScheduler()
27 scheduler.add_job(func=aps_test, args=("定时任务",), trigger="cron", second="*/5", id="cron_task")
28 scheduler.add_job(func=aps_pause, args=("一次性任务,停止循环任务",), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=12), id="pause_task")
29 scheduler.add_job(func=aps_resume, args=("一次性任务,恢复循环任务",), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=24), id="resume_task")
30 scheduler.add_job(func=aps_test, args=("循环任务",), trigger="interval", seconds=3, id="interval_task")
31 scheduler._logger = logging
32 
33 scheduler.start()
View Code

看看结果

是不是很容易?好了,删除任务,停止任务,恢复任务就介绍到这,下面我们看看监听任务。

6.意外

任何代码都可能发生意外,关键是,发生意外了,如何第一时间知道,这才是公司最关心的,apscheduler已经为我们想到了这些。

看下面的代码,

 1 # coding:utf-8
 2 from apscheduler.schedulers.blocking import BlockingScheduler
 3 from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
 4 import datetime
 5 import logging
 6 
 7 logging.basicConfig(level=logging.INFO,
 8                     format="%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s",
 9                     datefmt="%Y-%m-%d %H:%M:%S",
10                     filename="log1.txt",
11                     filemode="a")
12 
13 
14 def aps_test(x):
15     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
16 
17 
18 def date_test(x):
19     print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), x
20     print 1/0
21 
22 
23 def my_listener(event):
24     if event.exception:
25         print "任务出错了!!!!!!"
26     else:
27         print "任务照常运行..."
28 
29 scheduler = BlockingScheduler()
30 scheduler.add_job(func=date_test, args=("一定性任务,会出错",), next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=15), id="date_task")
31 scheduler.add_job(func=aps_test, args=("循环任务",), trigger="interval", seconds=3, id="interval_task")
32 scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
33 scheduler._logger = logging
34 
35 scheduler.start()
View Code

看看结果

是不是很直观,在生产环境中,你可以把出错信息换成发送一封邮件或者发送一个短信,这样定时任务出错就可以立马就知道了。

  好了,今天就讲到这,以后我们有机会再来拓展这个apscheduler,这个非常强大而且直观的后台任务库。

7作业运行的控制

add_job的第二个参数是trigger,它管理着作业的调度方式。它可以为date, interval或者cron。对于不同的trigger,对应的参数也相同。

(1). cron定时调度

year(int|str) – 4-digit year
month(int|str) – month (1-12)
day(int|str) – day of the (1-31)
week(int|str) – ISO week (1-53)
day_of_week(int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)
hour(int|str) – hour (0-23)
minute(int|str) – minute (0-59)
second(int|str) – second (0-59)
start_date(datetime|str) – earliest possible date/time to trigger on (inclusive)
end_date(datetime|str) – latest possible date/time to trigger on (inclusive)
timezone(datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)
和Linux的Crontab一样,它的值格式为:

Expression Field Description
* any Fire on every value
*/a any Fire everyavalues, starting from the minimum
a-b any Fire on any value within thea-brange (a must be smaller than b)
a-b/c any Fire everycvalues within thea-brange
xthy day Fire on thex-th occurrence of weekdayywithin the month
lastx day Fire on the last occurrence of weekdayxwithin the month
last day Fire on the last day within the month
x,y,z any Fire on any matching expression; can combine any number of any of the above expressions

几个例子如下:

(2). interval 间隔调度

它的参数如下:
weeks(int) – number of weeks to wait
days(int) – number of days to wait
hours(int) – number of hours to wait
minutes(int) – number of minutes to wait
seconds(int) – number of seconds to wait
start_date(datetime|str) – starting point for the interval calculation
end_date(datetime|str) – latest possible date/time to trigger on
timezone(datetime.tzinfo|str) – time zone to use for the date/time calculations
例子:

(3). date 定时调度

最基本的一种调度,作业只会执行一次。它的参数如下:
run_date(datetime|str) – the date/time to run the job at
timezone(datetime.tzinfo|str) – time zone for run_date if it doesn’t have one already
例子:

7.Flask-APScheduler使用

https://www.jianshu.com/p/2628f566b31c

参考:
https://www.cnblogs.com/yueerwanwan0204/p/5480870.html
http://debugo.com.shuadomainnames.cn/apscheduler/

打赏
神奇推荐位
  • 只要你说你爱我

    灯盏香客 / 著

    “衡大叔,大家都说三十来岁正是男人如狼似虎的年纪”“所以呢?”“我觉得这句话说得很对...

  • 劳力士

    浮梦公子 / 著

    其实这不过是一场由腹黑皇帝和狡黠恶女定下的一个约盟继而引发的一个故事!人人皆道,将军...

  • outlook

    暮夜寒 / 著

    【种田】+【空间】+【温馨】+【致富】+【虐渣】被炸成灰灰的莫颜重生到了古代,成了正...

  • 海信

    悠然世 / 著

    本书出版名《美人思无邪》,天猫购买地址=a1z10.1-b.w11350767-15...