# -*- coding: utf-8 -*-
from src.app import app
from posts import Posts
import time
@app.task(queue='test_celery_queue')
def add(x, y, c=0):
return x + y + c
@app.task
def sendmail():
post = Posts('smtp.qq.com', 'emailname@qq.com', 'password', port=465)
with post(ssl=True) as mail:
mail.text(
recipient ='receive@163.com,
subject='send by celery beat',
content=time.ctime()
)
1. 提前准备
略去相关工具的安装过程,其实都挺简单的!
celery作为异步任务队列, 需要一个中间人来协助celery存放和消耗任务信息。我们选择rabbitmq来做消息代理人。使用celery之前, 需要使用创建一个rabbitmq的管理员账号和一个能让该账号访问的vhost.
[Rabbitmq的安装配置以及网页管理插件]()
假设准备的rabbitmq的信息如下:
示例项目结构
2. celery实例及任务
2.1 生成实例
2.2 定义Task
注意, 我们给app.task这个装饰器传了queue这个参数, 这样当异步执行的时候,这个task会被丢到名称为test_celery_queue的队列中, 然后被为这个队列工作的worker拿到并执行。当然, 我们也可以在CELERY_CONFIG中配置:
如果我们不指定queue的话,celery会默认自己指定一个队列。task的队列一定要对应的worke, 否者就会只生产不消费, 这些task就永远不会被执行了。
2.3 启动worker
我们需要在项目路径下,也就是test.celery文件下运行python解释器, 否者python解释器无法找到 src 这个包。 或者直接将项目路径添加到PYTHONPATH变量,就像这样
export PYTHONPATH=/data/test.celery
然后再启动worker:
参数解析
更多可配置参数s通过
celery worker -h
查看。2.4 验证正确性
在一个终端显示日志
另一个终端启动python的交互解释器
注:如果没有设置PYTHONPATH, 那就要在我们的项目文件夹下启动
如果一切正常的话,运行第二、三、四条命令的时候会看到有日志输出。而且第二条命令会有错误日志,提示缺少参数。
用法说明
如果直接调用某一个task, 那么该task就跟普通的函数一样, 会同步运行并直接返回结果。想要异步执行, 就要使用 delay 或者 apply_async 。
delay: 相对简单,怎么给add传参,就怎么传给它。比如:
add.delay(4, 5, 9)
或者add.delay(4 , 5, c=19)
等.apply_async: 列举几个常用的参数:
3. celery beat
我们以定时发邮件为例子
3.1 添加发邮件的task
在task.py的基础上修改:
由于Python标准库发邮件有点繁琐,我这里使用了自己简单封装的posts来发送邮件。邮件的内容就是执行任务的时间。
3.2 配置定时任务的schedule
参数 schedule 说明, 通常使用两种方式来指定:
更多用法详见 官方文档
3.3 启动celery beat
更多可配置参数通过
celery beat -h
查看。3.4 验证正确性
一个页面显示celery beat 的输入日志
一个终端页面显示 celery worker 输出日志
如果分别能看到产生和消耗任务的日志输出。那就成功了。
4. supervisor
4.1 (supervisord)配置并启动supervisor
启动supervisor的命令是 supervisord。我们可以使用 -c 参数来指定其配置文件的位置。比如:
supervisord -c supervisord.conf
supervisor的配置文件 supervisord.conf:
4.2 配置具体项目
我们会为不同的程序编写独立的ini配置文件,然后放置到一个统一的路径(比如 /etc/supervisord.d/)下让supervisor读取.具体项目的配置文件 test.celery.ini 如下
简单说明
source /data/test.celery/env/bin/activate
4.3 (supervisorctl) 管理程序进程
通过
sudo supervisorctl
可以进入管理客户端。我们可以使用各种命令管理程序的进程:常用的命令有:
也可以不进入来管理 ,例如每次更新玩配置,我们可以使其快速生效:
5. 结束语
上文中只是简单介绍了supervisor 、celery、 celerybeat的简单运用。如果有兴趣的话可以自己去深入了解!
_本篇文章到此结束,原创手打! _
人生苦短, 我用python!