Python 异步任务模块 Celery 快速上手 (三)

定时任务

例子

这里我举一个监控网站的例子吧, 每十秒钟对我的网站进行一次想响应码输出

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操作也就这几个了

One thought on “Python 异步任务模块 Celery 快速上手 (三)”

Leave a Reply

Your email address will not be published. Required fields are marked *