[Python]学习Celery
来源:互联网 发布:手机追踪软件 编辑:程序博客网 时间:2024/09/21 06:32
文档:
http://docs.celeryproject.org/en/latest/userguide/workers.html#stopping-the-worker
笔记:
- Celery 对名字空间有较为严格要求,应该采用类似 Django 的以项目名开始的路径,例如 proj.tasks.taskA
- Celery的最简单的消息处理方式是采用默认的celery queue,direct exchange
- Celery默认会创建一个进程池,其中worker进程数等于CPU核心数
- 用TERM信号结束后台运行的Celery实例,即 kill -15 pid
Example 1
结合 Supervisor 写了个后台自动运行worker的Demo
类似 ping 服务器,收到请求后,睡眠一段时间,然后返回响应信息
Step 1 建立工程目录
# 目录结构如下,注意 client.py 和 test1 同级test1\__init__.py celery.py celeryconfig.py tasks.pyclient.py # producer
Step 2 代码编写
celeryconfig.py
BROKER_URL = 'redis://localhost:6379/0'CELERY_RESULT_BACKEND = 'redis://localhost'
celery.py
创建app实例,进行配置
from __future__ import absolute_importfrom celery import Celeryapp = Celery('test1', include=['test1.tasks'])app.config_from_object('test1.celeryconfig')if __name__ == '__main__': app.start()
tasks.py
from __future__ import absolute_importfrom test1.celery import appimport timeimport random@app.taskdef ping(seq, start): delay = random.randint(0, 3) time.sleep(delay) ret = time.time() return '{0} - pong {1}, run {2} seconds'.format(seq, delay, ret-start)
client.py
import timefrom test1 import tasksdef test(): results = set(tasks.ping.delay(i, time.time()) for i in range(10)) while results: for i in results: if i.ready(): sav = i results.remove(i) print sav.get() breaktest()
Step 3 测试运行
cd 到 test1 的父目录,执行
celery -A test1 worker -l infopython client.py
成功运行则会看到类似以下输出
1 - pong 0, run 0.00337100028992 seconds
2 - pong 1, run 1.00772404671 seconds
0 - pong 3, run 3.04080796242 seconds
3 - pong 3, run 3.00674390793 seconds
7 - pong 0, run 3.00365185738 seconds
5 - pong 2, run 3.00629997253 seconds
9 - pong 2, run 5.00392007828 seconds
4 - pong 3, run 6.00150322914 seconds
6 - pong 3, run 5.99989199638 seconds
8 - pong 2, run 7.99660491943 seconds
前面几个任务的运行时间和睡眠时间一致,后面的进程运行时间更长,和 round-robin 的调度方式相符
Step 4 加入supervisor管理
如果不熟悉 supervisor,可以先看看 这篇
官方示例 https://github.com/celery/celery/tree/master/extra/supervisord
如果使用虚拟环境,只需使用相应二进制文件的绝对路径即可。
/etc/supervisor/test1.conf
[program:test1]directory=/Users/apple/PycharmProjects/Funcommand=/Users/apple/.pyenv/versions/my-virtual-env-2.7.10/bin/celery -A test1 worker -l infoautostart=trueautorestart=truestartsecs=10stdout_logfile=/Users/apple/test1.logredirect_stderr=truekillasgroup=true
启动 supervisor,用 supervisorctl 确认 test1正常运行。用 ps aux | grep python 应该可以看到多个worker进程。
运行 client.py 验证。
————————————————————–
supervisor 配置
http://supervisord.org/configuration.html
supervisorctl 中
stop + remove 可以移除一个被管理的进程
add program 加入一个曾管理过的进程
更多的指令用 ? command 即可查看
- [Python]学习Celery
- celery学习
- python学习(5):celery-beat-task异步驱动框架
- python学习—Day47—celery异步分布式(一)
- Python - rq / mrq / Celery
- Python Celery队列
- Python-Celery的使用
- python 安装celery
- Python之Celery(一)
- celery学习笔记
- Celery学习总结
- Celery 初步学习
- Celery 框架学习笔记
- celery学习记录
- Celery学习笔记
- python学习[4]: 用python celery + rabbitMQ搭建并行分布式框架及验证
- python celery(任务调度器)
- Python - Django分布式Celery使用
- hdu 5631 Rikka with Graph【并查集+判断一个祖先+思维】
- linux 下SVN服务端创建版本库
- react-native启动异常,react-deep-force-update/.babelrc
- 可并堆--左偏树(Bzoj1367&&Bzoj1455)
- 对MySQL加锁的初步理解(一)
- [Python]学习Celery
- iOS 播放器思路
- C基础——itoa
- 终端中文件访问命令
- Android判断屏幕状态与屏幕解锁和锁定
- 深入分析 Java I/O 的工作机制
- ubuntu14.04LTS更新源
- 机器学习题目汇总二
- Android源码下载小结