監控task的執行結果:任務id,結果,traceback,children,任務狀態python
配置 backend='redis://127.0.0.1:6379/5'
給Celery的app對象,直接在redis中查看web
還能夠redis
健壯celery:celery -A proj worker -l info
數據庫
☁ proj tree ├── __init__.py ├── celery.py | app=Clery('proj',include=['proj.tasks']) app.config_from_object('proj.config') if __name__==__main__: app.start() ├── config.py | CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/6' BROKER_URL = 'redis://127.0.0.1:6379/5' └── tasks.py | @app.task # 注意這個文件名必須是tasks.py def add(x, y): return x + y
tasks能夠有多個在celery.py中添加一行代碼加載任務函數django
app.autodiscover_tasks(['proj.sms', 'proj.email'])
網絡
Scheduler計劃定時任務:celery -A proj worker -B -l info
併發
#config.py CELERY_TIMEZONE = 'Asia/Shanghai' # 指定時區 from datetime import timedelta CELERYBEAT_SCHEDULE = { 'add-every-30-seconds': { 'task': 'proj.tasks.add', # 指定要執行的函數任務 'schedule': timedelta(seconds=30), # 指定計劃時間間隔30s執行一次task 'args': (16, 16) }, }
celery.schedules import crontab定時週期任務:(好比每週一執行一次 )app
只須要修改 'schedule': crontab(hour=7, minute=30, day_of_week=1),
異步
指定隊列名:函數
啓動加上-Q參數 celery -A proj worker --loglevel=info -Q 'testq'
跑任務時 add.delay(3,4,queue='testq')
指定開啓的worker進程數:單個Celery進程每分鐘就能夠處理數百萬個任務
底層是調用的Python的multiprocessing模塊中的Pool進程池思想來作
啓動加上-c參數 celery -A proj worker --loglevel=info -c 2
2個worker進程來同時搶任務
圖像化查看broker裏面的數據,查看任務狀態,以及任務的詳細信息:flower的webUI
pip install flower
注意建立celery實例app時指定的broker設置的redis/5
任意目錄執行 celery flower --port=5555 --broker=redis://localhost:6379/5
應用: django調用celery跑異步任務,常見場景有註冊成功,發送郵件能夠異步來防止網絡IO阻塞,以及耗時間的任務,能夠在WEB應用中使用這種異步方式
django-celery==3.1.17
與celery==3.1.17
對應python manage.py migrate
@task def add(x,y):
python manage.py celery worker --loglevel=info
celery內存泄露分析
celery配置項以下
CELERYD_CONCURRENCY = 2 celery worker併發數 CELERYD_MAX_TASKS_PER_CHILD = 5 每一個worker最大執行任務數
執行celery -A ansibleAPI.celery worker啓動celery,經過ps -ef | grep celery能夠看到兩個celery worker進程(8226,8228)。
利用celery worker進行某個任務,當worker沒有執行到最大任務時(即銷燬重建),每執行一次任務佔用內存必然有所增長,任務數爲9,10時(celery均勻調度,併發數*最大任務數),分別有原8228 worker被銷燬,從新建立9386 worker及原8226 worker被銷燬,從新建立9564 worker,此時,運行第9次時,佔用總內存有所降低,運行第10次時,總內存回到初如值,一樣任務執行第1九、20次狀況相似。
celery併發計算規則
celery任務併發只與celery配置項CELERYD_CONCURRENCY 有關,與CELERYD_MAX_TASKS_PER_CHILD沒有關係,即CELERYD_CONCURRENCY=2,只能併發2個worker,此時任務處理較大的文件時,執行兩次能夠看到兩個task任務並行執行,而執行第三個任務時,開始排隊,直到兩個worker執行完畢。
結論celery執行完任務不釋放內存與原worker一直沒有被銷燬有關,所以CELERYD_MAX_TASKS_PER_CHILD能夠適當配置小點,而任務併發數與CELERYD_CONCURRENCY配置項有關,每增長一個worker必然增長內存消耗,同時也影響到一個worker什麼時候被銷燬,由於celery是均勻調度任務至每一個worker,所以也不宜配置過大,適當配置。