[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 即可查看

0 0
原创粉丝点击