1. 程式人生 > >Celery學習筆記----趟一下 celery 的坑

Celery學習筆記----趟一下 celery 的坑

celery中文文件


那麼什麼是Celery呢?

Celery是一個用Python開發的非同步的分散式任務排程模組。

Celery本身不包含訊息服務,使用第三方訊息服務,也就是Broker,來傳遞任務,目前支援的有Rebbimq,Redis,資料庫以及其他的一些比如Amazon SQS,Monogdb和IronMQ 。

因為專案裡面用的是Redis,所以這裡以Redis作為Broker。


安裝


pip  install celery

使用Redis作為Broker的話,可以兩者一塊安裝

sudo pip install -U celery[redis]

當然如果正式生產環境中,有可能redis伺服器和Celery在不同的機器上面的話,就要兩者單獨安裝

sudo apt-get install redis-server 這個命令可以安裝redis,包括了redi-cli工具

第一個例子:

這是在celery中文文件中的程式碼,你需要修改成自己的

from celery import Celery

app = Celery('hello', broker='amqp://[email protected]//')

@app.task
def hello():
    return 'hello world'

我是把程式碼儲存為celery_tasks資料夾下的tasks.py檔案(這個例子執行在ubuntu下的,上面運行了Redis,所以broker可以是127.0.0.1或者自己設定的ip)。
在這裡插入圖片描述


然後在終端下啟動worker。

celery -A  celery_tasks.tasks worker -l info 

這個命令會啟動一個worker來執行task。執行完這條命令後,不出意外的出現下面這個介面的話表示worker已經啟動成功,正在等待執行任務。
在這裡插入圖片描述

我的發郵件功能用到celery


但是在中間遇到了一個bug

在這裡插入圖片描述
看了半天大致瞭解到

是celery 執行時 需要 讀取django 中的資訊

所以又在tasks下 加了下面的程式碼:

import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
django.setup()

在這裡插入圖片描述

又執行 發現可以了


還有一個bug

MISCONF Redis被配置為儲存RDB快照,但目前無法在磁碟上存留。可能修改資料集的命令被禁用。請檢查Redis日誌,瞭解有關錯誤的詳細資訊

解決方法----點選進入:

關鍵程式碼:

config set stop-writes-on-bgsave-error no

總結:

如果你要將你的celery 在另一臺電腦上執行
1.將你的專案程式碼拷貝過去
2.把這個任務加上下面的程式碼
            # import os
            # import django
            # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
            # django.setup()
3.     celery -A  celery_tasks.tasks worker -l info 
4.django 想要執行  那麼安裝的所有的包  都得拷貝過去  
5.步驟 先將本地匯出,再在另一臺電腦 一次性 安裝
6.pip freeze > ~/dailyfresh.txt
7.pip install -r ~/dailyfresh.txt -i xx xxxxxx
8.如果你的任務執行時間比較長   用celery進行非同步執行
9.celery  還有一個定時器的功能    time.sleep()
10.celery 執行時 需要 讀取django 中的資訊  
    所以要在任務下買你加上2中的程式碼   
    否則報錯
    django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_BACKEND, 
    but settings are not configured. You must either define the environment variable 
    DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
11.執行前 需要 啟動redis  服務 因為redis 是資料庫