天天看點

任務隊列 Celery

我們需要一個任務隊列來進行任務的配置設定和維護,我們選擇最常見的 Celery

Celery 介紹

Celery (芹菜)是一個異步任務隊列/基于分布式消息傳遞的作業隊列

(PS:不得不說,我并不喜歡芹菜,這差點讓我放棄了它

Celery 的結構非常簡單,大緻分為 3 個部分:

  • worker部分

    負責任務的處理,即執行工作的線程
  • broker部分

    負責任務消息的分發以及任務結果的存儲,這部分任務主要由中間資料存儲系統完成,比如消息隊列伺服器 RabbitMQ 、Redis 、Amazon SQS、MongoDB、IronMQ 等或者關系型資料庫,使用關系型資料庫依賴 Sqlalchemy 或者 Django 的 ORM
  • Celery主類

    負責進行任務最開始的指派與執行控制,可以是單獨的 Python 腳本,也可以和其他程式結合,應用到 Django 或者 Flask 等 Web 架構裡面以及你能想到的任何應用

安裝

pip install celery
pip install celery-with-redis
pip install flower
           

flower

是 Celery 的監控工具,提供了圖形界面監控任務的執行

安裝 redis

wget http://download.redis.io/releases/redis-.tar.gz
tar xzf redis-.tar.gz
cd redis-
make -j8
           

啟動 redis

任務隊列 Celery

啟動 flower

任務隊列 Celery

啟動 celery

任務隊列 Celery

送出任務

tasks.py

import time
from celery import Celery, platforms

platforms.C_FORCE_ROOT = True
celery = Celery("tasks", broker='redis://localhost:6379/0')

@celery.task
def add(x, y):
    return x + y
           

任務執行

from tasks import *

add.delay(, )
           

執行結果

任務隊列 Celery

檢視 flower(http://localhost:7788/)

任務隊列 Celery

以 root 身份啟動 celery

celery -A symbolic_exec worker --loglevel=info
export C_FORCE_ROOT = "true"
           

若任務被修改,Celery 需要重新啟動,否則無法随之更改