天天看點

CeleryCelery

文章目錄

  • Celery
      • 1 定義
      • 2,使用場景
      • 2 使用celery
      • 3 Django + Celery

Celery

1 定義

Celery 是一個簡單、靈活且可靠的,處理大量消息的分布式系統

它是一個專注于實時處理的任務隊列,同時也支援任務排程

中文官網:http://docs.jinkan.org/docs/celery/

線上安裝 sudo pip3 install celery

離線安裝

tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python3 setup.py build
python3 setup.py install
           

2,使用場景

1,任務排程

2,避開阻塞操作

名詞解釋:

broker - 消息傳輸的中間件,生産者一旦有消息發送,将發至broker;【RQ,redis】

backend - 用于存儲消息/任務結果,如果需要跟蹤和查詢任務狀态,則需添加要配置相關

worker - 工作者 - 消費/執行broker中消息/任務的程序

CeleryCelery

2 使用celery

​ 1, 建立celery應用

#建立 tasks.py 檔案

from celery import Celery
#初始化celery, 指定broker
app = Celery('guoxiaonao', broker='redis://@127.0.0.1/1')

# 建立任務函數
@app.task
def task_test():
    print("task is running....")
    
#在該tasks.py同級目錄下 執行 celery -A tasks worker --loglevel=info
           

​ 2,推送任務

​ 在tasks.py檔案的同級目錄進入 python3 執行 如下代碼

from tasks import task_test
task_test.delay()

           

​ 3,存儲執行結果

​ Celery提供存儲任務執行結果的方案,需借助 redis 或 mysql 或Memcached 等

​ 詳情可見 http://docs.celeryproject.org/en/latest/reference/celery.result.html#module-celery.result

from celery import Celery


app = Celery('demo',
             broker='redis://@127.0.0.1:6379/1',
             backend='redis://@127.0.0.1:6379/2',
             )

# 建立任務函數
@app.task
def task_test(a, b):
    print("task is running")
    return a + b
           

3 Django + Celery

1,建立項目+應用

#正常指令
django-admin startproject chongci
python manage.py startapp user
           

2,建立celery.py

在settings.py同級目錄下 建立 celery.py檔案

檔案内容如下:

from celery import Celery
from django.conf import settings
import os

# 為celery設定環境變量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'chongci.settings')



關于os.environ[]和os.getenv()和os.environ.get()三者簡單差別
	這三者都是擷取環境變量鍵對的值的方法。
	os.environ[]表示的是一個dict型的資料,比如os.environ[‘APPDATA’]就表示 'APPDATA’這個key鍵對的值。但如果key不存在,就會報錯,比如	    os.environ[‘1234’]就會報錯。
	而os.getenv()是一個函數,如果不存在就會傳回None。
	基本可以認為os.getenv == os.environ.get

# 建立應用
app = Celery("chongci")
# 配置應用
app.conf.update(
    # 配置broker
    BROKER_URL='redis://:[email protected]:6379/1',
)
# 設定app自動加載任務
app.autodiscover_tasks(settings.INSTALLED_APPS)
           

3, 在應用子產品【user目錄下】建立tasks.py檔案

檔案内容如下:

from chongci.celery import app
import time

@app.task
def task_test():
    print("task begin....")
    time.sleep(10)
    print("task over....")
           

4, 應用視圖編寫;内容如下:

from django.http import HttpResponse
from .tasks import task_test
import datetime

def test_celery(request):
    task_test.delay()
	now = datetime.datetime.now()
    html = "return at %s"%(now.strftime('%H:%M:%S'))
    return HttpResponse(html)
           

5, 分布式路由下添加 test_celery函數對應路由,此過程略

6, 啟動django python3 manage.py runserver

7, 建立 celery worker

​ 在項目路徑下,即chongci 下 執行如下

celery -A chongci worker -l info
           

8,上線時 執行celery指令

在項目路徑下,即chongci 下 執行如下

celery -A chongci worker -l info
           

8,上線時 執行celery指令

nohup指令:如果你正在運作一個程序,而且你覺得在退出帳戶時該程序還不會結束,那麼可以使用nohup指令。該指令可以在你退出帳戶/關閉終端之後繼續運作相應的程序。
nohup celery -A mywiki worker -l info > c.log 2>&1 &
           

繼續閱讀