[Python]学习Celery

文档:

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.py
client.py   # producer

Step 2 代码编写

celeryconfig.py

BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost'

celery.py
创建app实例,进行配置

from __future__ import absolute_import

from celery import Celery

app = Celery('test1',
             include=['test1.tasks'])
app.config_from_object('test1.celeryconfig')

if __name__ == '__main__':
    app.start()

tasks.py

from __future__ import absolute_import

from test1.celery import app
import time
import random


@app.task
def 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 time

from test1 import tasks


def 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()
                break

test()

Step 3 测试运行

cd 到 test1 的父目录,执行

celery -A test1 worker -l info
python 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/Fun
command=/Users/apple/.pyenv/versions/my-virtual-env-2.7.10/bin/celery -A test1 worker -l info

autostart=true
autorestart=true

startsecs=10

stdout_logfile=/Users/apple/test1.log
redirect_stderr=true

killasgroup=true

启动 supervisor,用 supervisorctl 确认 test1正常运行。用 ps aux | grep python 应该可以看到多个worker进程。

运行 client.py 验证。

————————————————————–

supervisor 配置
http://supervisord.org/configuration.html

supervisorctl 中
stop + remove 可以移除一个被管理的进程
add program 加入一个曾管理过的进程
更多的指令用 ? command 即可查看

你可能感兴趣的:(python)