在Django上配置異步任務隊列Celery

異步任務使用

1.安裝Broker

這里我們使用redis作為broker,當然你也可以使用rabbitmq作為broker,安裝完成后默認啟動了,也不需要其他任何配置

yum install redis       //使用redis

或者

yum install rabbitmq-server //使用rabbitmq

2.安裝Celery

pip3 install celery

3.目錄結構

celery用在django項目中,django項目目錄結構(簡化)如下

website/
|-- deploy
|  |-- admin.py
|  |-- apps.py
|  |-- __init__.py
|  |-- models.py
|  |-- tasks.py
|  |-- tests.py
|  |-- urls.py
|  `-- views.py
|-- manage.py
|-- README
`-- website
  |-- celery.py
  |-- __init__.py
  |-- settings.py
  |-- urls.py
  `-- wsgi.py

4.創(chuàng)建website/celery.py主文件

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, platforms
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'website.settings')
 
app = Celery('website')

app.config_from_object('django.conf:settings', namespace='CELERY')
 
app.autodiscover_tasks()
 
# 允許root 用戶運行celery
platforms.C_FORCE_ROOT = True
 
@app.task(bind=True)
def debug_task(self):
  print('Request: {0!r}'.format(self.request))

5.在website/__init__.py文件中增加如下內容,確保django啟動的時候這個app能夠被加載到

from __future__ import absolute_import
 
from .celery import app as celery_app
 
__all__ = ['celery_app']

6.各應用創(chuàng)建tasks.py文件,這里為deploy/tasks.py

from __future__ import absolute_import
from celery import shared_task
 
@shared_task
def add(x, y):
  return x + y

注意tasks.py必須建在各app的根目錄下,且只能叫tasks.py,不能隨意命名

7.views.py中引用使用這個tasks異步處理

from deploy.tasks import add
 
def post(request):
  result = add.delay(2, 3)

8.啟動celery

celery -A website worker -l info

這樣在調用post這個方法時,里邊的add就可以異步處理了

定時任務

定時任務的使用場景就很普遍了,比如我需要定時發(fā)送報告給老板~

1. 定時任務配置

website/celery.py文件添加如下配置以支持定時任務crontab

from celery.schedules import crontab
 
app.conf.update(
  CELERYBEAT_SCHEDULE = {
    # 每20秒執(zhí)行一次add函數(shù),并傳了兩個參數(shù)5和6
    'sum-task': {
      'task': 'deploy.tasks.add',
      'schedule': timedelta(seconds=20),
      'args': (5, 6)
    }
    # 每周一早上4:30執(zhí)行report函數(shù)
    'send-report': {
      'task': 'deploy.tasks.report',
      'schedule': crontab(hour=4, minute=30, day_of_week=1),
    }
  }
)

timedeltadatetime中的一個對象,需要

from datetime import timedelta

引入,有如下幾個參數(shù)

- days
- seconds
- microseconds
- milliseconds
- minutes
- hours

crontab的參數(shù)有:

- month_of_year
- day_of_month
- day_of_week
- hour
- minute

2. deploy/tasks.py 文件添加report方法:

@shared_task
def report():
  return 5

3.啟動celery beat

celery啟動了一個beat進程一直在不斷的判斷是否有任務需要執(zhí)行

celery -A website beat -l info

Tips

1.如果你同時使用了異步任務和計劃任務,有一種更簡單的啟動方式 celery -A website worker -b -l info ,可同時啟動worker和beat

2.如果使用的不是rabbitmq做隊列那么需要在主配置文件中 website/celery.py 配置broker和backend,如下:

# redis做MQ配置
app = Celery('website', backend='redis', broker='redis://localhost')
# rabbitmq做MQ配置
app = Celery('website', backend='amqp', broker='amqp://admin:admin@localhost')

3.celery不能用root用戶啟動的話需要在主配置文件中添加platforms.C_FORCE_ROOT = True
4.celery在長時間運行后可能出現(xiàn)內存泄漏,需要添加配置 CELERYD_MAX_TASKS_PER_CHILD = 10 ,表示每個worker執(zhí)行了多少個任務就死掉

文章從題目加轉載,原文在Django上配置異步任務隊列Celery 簡單幾步即可完成!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容