定时任务
例子
这里我举一个监控网站的例子吧, 每十秒钟对我的网站进行一次想响应码输出
import requests
from celery.task import periodic_task
from datetime import timedelta
@periodic_task(
run_every=timedelta(seconds=10),
name="get_web_status",
)
def periodic_task_test():
result = requests.get("https://www.slll.info/")
print("site status: %s" % result.status_code)
执行celery命令,启动你的定时任务
celery -A [你的celery类的名称] worker -l info
celery -A [你的celery类的名称] beat -l info
worker是celery执行任务的进程,beat是celery对任务进行调度的进程
任务锁
有时候任务执行的时间可能会超过10秒,10秒一到,beat直接就把任务发给worker,然后worker又开始执行下一个任务了,这样不太好,不好在如果单个任务资源消耗量大,那么就会出现阻塞,解决办法就是加上任务锁
现在我们把执行时间改成5秒一次
import requests
import redis
from datetime import timedelta
from celery.task import periodic_task
@periodic_task(
run_every=timedelta(seconds=5),
name="get_web_status",
)
def periodic_task_test():
r = redis.StrictRedis(host='localhost', port=6379, db=0)
lock = r.get("lk")
print("%s" % lock)
if lock:
return
r.set("lk", "running")
try:
result = requests.get("http://www.slll.info/")
print("site status: %s" % result.status_code)
r.set("lk", "")
except Exception:
r.set("lk", "")
通过redis获取一个lk的值,定时任务内的判断语句判断lk是否为true,如果为true代表任务已经在执行了,如果没有在执行就把lk设置成有值,等任务结束或者出现异常的时候,把lk设置成空,这样当这个任务正在执行的时候,其他任务执行判断lk是否有值,如果有值就直接return不执行
基本上常用的celery操作也就这几个了
学习了哈,不错!!