Celery介紹html
1.什麼是Celery
Celery是一個python模塊,它在官網的定義:Celery is asynchronous task queue/job based on distributed message passing. It is focused on real-time operation, but supports scheduling as well.
這裏強調的概念包括:異步任務隊列,分佈式消息傳遞,實時或調度任務。python
2.爲何要使用Celery
Celery是一個使用Python開發的分佈式任務調度模塊,所以對於大量使用Python構建的系統,能夠說是無縫銜接,使用起來很方便。Celery專一於實時處理任務,同時也支持任務的定時調度。所以適合實時異步任務定時任務等調度場景。git
3.Celery任務隊列
任務隊列是一種在進程或機器之間分發任務的機制。
任務隊列的輸入是被稱爲任務(task)的工做單元。專用的工做進程會時刻監控任務隊列,來獲取要執行的任務。
celery的client和worker經過消息來「溝通「。Celery須要依靠RabbitMQ等做爲消息代理,同時也支持Redis甚至是Mysql,Mongo等,固然,官方默認推薦的是RabbitMQ。
爲了開始一個任務,client須要向隊列中發送任務消息,而後broker會把任務投遞給worker處理。一個celery系統能夠包含多個worker和broker,以便實現高可用和可水平擴展。github
4.官方網站:http://www.celeryproject.org/redis
5.中文文檔:http://docs.jinkan.org/docs/celery/sql
Celery配置shell
參考Github實踐例子:https://github.com/celery/celery/tree/3.1/examples/djangodjango
1.在包含settings文件夾proj的__init__.py中添加json
# proj/__init__.py from __future__ import absolute_import from .celery import app as celery_app
2.一樣在該文件夾中建立celery.py文件。bash
# proj/celery.py # coding:utf8 from __future__ import absolute_import 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', 'proj.settings') app = Celery('proj') # Using a string here means the worker will not have to # pickle the object when using Windows. app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))
3.在settings.py文件中,添加一些celery的配置。
# 修改點1 INSTALLED_APP += [ 'kombu.transport.django', 'djcelery' ] # 修改點2 # 生產環境我使用redis做爲broker BROKER_URL = 'redis://172.23.18.116:6379/0' # 開發環境能夠直接用django做爲broker BROKER_URL = 'django://' # 修改點3 #: Only add pickle to this list if your broker is secured #: from unwanted access (see userguide/security.html) CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json'
4.作好上面的步驟以後,就能夠在本身的app中新增tasks.py文件,裏面用shared_task來裝飾celery任務,如demoapp/tasks.py。
from __future__ import absolute_import from celery import shared_task @shared_task def add(x, y): return x + y @shared_task def mul(x, y): return x * y @shared_task def xsum(numbers): return sum(numbers)
celery測試及使用
1.首先啓動worker。
# 這裏指定了配置,默認的話忽略info後面 python manage.py celery worker --loglevel=info --settings=proj.settings
2.使用下面的命令也就是在django環境中執行,經常使用來測試django模塊功能。
# 同上忽略指定的配置文件 python manage.py shell --settings=proj.settings
試着執行shared_task add()。
from demoapp.tasks import add add.delay(3, 3)
上面的worker log中出現add()的return也就是6,說明celery配置正確。
3.django-celery的定時任務功能
這一步是celery beat定時或者定間隔給celery發送task。
# proj/settings.py CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'12
接下來,將目標djcelery的定時文件遷移一下,便可在admin後臺配置定時任務時間間隔等內容。
python manage.py migrate
再而後
python manage.py celery beat
能夠看到celery beat開始按以前admin後臺設置的時間間隔或者crontab開始發送task給celery了,此時天然也須要celery worker在running狀態。celery beat發送的任務return的結果在celery log中能夠看到,說明django-celery 定時任務配置成功。
原文出處:https://www.jzfblog.com/detail/115,文章的更新編輯以此連接爲準。歡迎關注源站文章!