引言:
当需要用python创建和完成定时任务时,第一个会想到的就是使用crontab库,
但是crontab不支持Windows系统,于是我们可以使用一个支持Windows且功能强大的库:Celery。
Celery-分布式任务队列:
Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。
它是一个任务队列,专注于实时处理,同时还支持任务调度。
Celery是开源的,并根据BSD许可授权。
Celery由Python语言实现。
Celery安装:
celery的版本非常令人头疼,它的版本无法做到完全上下兼容,且有些版本会与一些库冲突,所以对于celery版本的选择非常重要:
1、celery 4.0.0~4.2.0(latest) 目前最新的celery版本是官方的4.2.0 链接:http://docs.celeryproject.org/en/latest/
(1) celery 4.0.0及以上版本目前不兼容python3.7 由于在python3.7中 async变成了关键字 在运行celery worker的时候会报错,
from . import async,base 此处出错。
(2) django-celery是一个便于在django工程中管理celery的库,但是django-celery不支持celery 4.0.0以上版本,如若要在django工程中
使用celery,请降低版本,比如celery 3.1.26
2、celery 3~4的版本之间 相对稳定 本人用的就是celery 3.1.26版本 推荐 pip install celery==3.1.26
Celery介绍:
上图为celery工作简要流程,原谅我盗的图...原作者po上:https://www.qikqiak.com/
1、application(task producer)"任务的生产者",我们通过代码层面,产生任务然后发送给broker(task queue)
2、celery beat(task scheduler)"任务调度器",常见为生成定时任务
3、broker(task queue)"任务队列",我们需要将任务送往任务队列去,官网强烈推荐的broker有:redis和rabbitmq
4、worker(taks consumer)"任务消费者",在任务送往broker后,worker从中进行操作,完成任务后生成result
5、result 完成任务后产生的结果
Broker的选择:
broker我们可选的有redis和rabbitmq,官网推荐的两种,我们这里选redis,相对于rabbitmq更加轻量级,安装方便。
所以我们需要安装redis,redis很容易安装,这里就不细讲了,po上github链接:https://github.com/MicrosoftArchive/redis/releases
与此同时 celery还需要python的redis依赖库这里注意版本 pip install redis==2.10 最好下2.10版本,这里是为了后续和django联用
若下最新版本,可能会报以下错:
任务的编写:
主要的代码层面来了,我们通过流程图知道,我们需要生产任务,目录结构如下图:
1、其中__init__.py是通过启动项目时,选择的配置文件:
1 from celery import Celery
2
3 app = Celery( 'demo' )
4 app. config_from_object( 'celery_app.celeryconfig' )
2、celeryconfig.py里面主要是celery的配置:
from datetime import timedelta
from celery. schedules import crontab
BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
CELERY_TIMEZONE= 'Asia/Shanghai'
CELERY_IMPORTS = (
'celery_app.task1' ,
'celery_app.task2' ,
)
CELERYBEAT_SCHEDULE= {
'task1' : {
'task' : 'celery_app.task1.add' ,
'schedule' : timedelta( seconds= 10 ) ,
'args' : ( 2 , 8 )
} ,
'task2' : {
'task' : 'celery_app.task2.mul' ,
'schedule' : crontab( hour= 16 , minute= 45 ) ,
'args' : ( 4 , 5 )
}
}
3、task1的任务:
import time
from celery_app import app
@app. task
def add ( x, y) :
time. sleep( 3 )
return x + y
4、 task2的任务:
import time
from celery_app import app
@app. task
def mul ( x, y) :
time. sleep( 3 )
return x * y
运行任务:
1、打开redis服务器:
$ .\redis-server.exe .\redis.windows.conf
2、在celery_app文件的上一级 shift+右键 打开命令行窗口,win10打开powershell:
celery worker -A celery_app --pool=solo -l INFO
此命令打开worer 任务目标为celery_app windows下需要加--pool=solo 日志级别为INFO
3、然后打开celery beat 启动定时任务,另开一个命令行窗口:
celery beat -A celery_app -l INFO
4、结果如下:
可以看见celery beat一直在隔10秒发送任务
再来看worker:
第一次是处理了4秒 其余是3秒,可以看出windows处理celery还是不太稳定。
结语:celery是一个强大的库,能让我们处理异步任务,不过最好还是于Linux上运行
常见错误:
在linux系统中使用root用户常见错误:
Running a worker with superuser privileges when the
worker accepts messages serialized with pickle is a very bad idea!
If you really want to continue then you have to set the C_FORCE_ROOT environment variable (but please think about this before you do ).
from celery import Celery, platforms
platforms. C_FORCE_ROOT= True