五分鍾看懂Celery定時任務


 

Django下使用Celery

使用場景:

1, Web應用。 當用戶觸發的一個操作需要很長時間才能執行完成,那么就可以把它當做一個任務去交給Celery去異步執行, 執行完成之后再返回給用戶,這短時間用戶不需要等待響應處理的過程, 反而提高了網站吞吐量和響應時間。

2, 定時任務,生產環境經常會跑一些定時任務,假如你有成千上萬台服務器,上千種任務, 定時任務的管理很困難,Celery可以幫助我們快速的在不同的機器設定不同種的任務。

3, 同步完成的附加工作都可以異步完成,比如:發送短信/郵件、消息推送、清理/設置緩存等。

特性:

1, 方便地查看定時任務的執行情況,比如是否執行成功,當前狀態,執行任務花費時長等。

2, 可以使用功能齊備的管理后台或者命令行添加,更新,刪除任務等。

3, 方便把任務和配置管理相關聯。

4, 可選多進程, Eventlet和Gevent三種模式並發執行。

5, 提供錯誤處理機制。

6, 提供多種任務原語,方便實現任務分組,拆分和調用鏈。

7, 支持多種消息代理和存儲后端。

Celery的使用

pip install django

pip install django-celery

以上兩個依賴安裝完成之后就開始編寫代碼吧。

創建Dajngo工程

django-admin.py startproject dc_test       # 創建工程

django-admin.py stratapp projectmanageapp      # 創建app

創建完工程之后, 打開dc_test/dc_test/settings.py  

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'demo',
    'djcelery'           # 添加  djcelery應用
)        
from datetime import timedelta


CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'demo.tasks.hello_world',
        'schedule': timedelta(seconds=2),
    },
}

添加完成之后,在同級目錄下,創建Celery.py 文件

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dc_test.settings')

app = Celery('dc_test')

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

celery.py文件添加完成之后在同級目錄__init__.py中添加,

from __future__ import absolute_import, unicode_literals

from .celery import app as celery_app

__all__ = ['celery_app']

在app應用下創建tasks.py文件。

from __future__ import absolute_import, unicode_literals
from celery import shared_task

@shared_task
def hello_world():
    with open("D:\dc_test\output.txt", "a") as f:
        f.write("hello world")
        f.write("\n")

文件都創建好之后,就開始運行項目吧, 等項目運行成功之后會自定生成以下文件。

celerybeat-schedule.bak

celerybeat-schedule.dat

celerybeat-schedule.dir

執行tasks:

python manage.py celery worker -l info

 

執行bate:

python manage.py ceery beat

到這里之后,就可以了。趕快試試吧。

源碼地址: https://github.com/Mrwyc/Django-Celery-Demo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM