celery 官網幫助文件
前言自從發了上次的文章使用celery之深入celery配置, 有一些網友再問我怎麼讓celery跑起來. 其實說來也是,celery在新手眼裡真的是比較重量級,不好懂,今天先讓他跑起來吧 本文大部分**和使用方法都可以在celery官網看到
我想要的效果
我想實現乙個定時任務, 每3個小時的12分啟動,假如是定時任務大概是這樣的:
選擇mq
使用訊息佇列其實就是為了給任務乙個時序,保證任務訊息不丟失,想想你的乙個任務是關乎公司核心業務,猶豫某種原因失敗或者丟失怎麼辦? celery就需要這個訊息的儲存,我這裡還是選擇rabbitmq mongodb,redis都無所謂 只是儲存的位置的問題. 選擇其他的工具沒有遠端控制和監控
寫法就是:
其中可以這樣解析
vhost是命名空間,就像**的子網域名稱,在這裡由於許可權控制我們需要先建立賬號和密碼
$ rabbitmqctl add_vhost myvhost
$ rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"
編寫tasks.py指令碼
def add(x, y):
return x + y
#### 簡單的使用
-a指定的就是任務的程式 tasks.py worker表示他是乙個執行任務角色. 後面的記錄日誌型別,預設是info
這個時候,你可以在當前目錄下使用python互動模式生成乙個任務
>>> add.delay(4, 4)
這個時候可以看見上面的日誌裡面多了一些訊息,然後裡面多了這個任務的資訊,比如下面這樣:
[2013-11-24 17:11:59,371: info/mainprocess] task tasks.add[f27994b0-3628-43a1-b136-540a360e3d64] succeeded in 0.00102571400021s: 8
可以看見你的任務被執行了
假如我使用python的包, 就像乙個應用,讓**結構化一些
proj
├── __init__.py
├── celery.py
└── tasks.py
from __future__ import absolute_import
from celery import celery
broker='amqp://myuser:mypassword@localhost:5672/vhost',
backend='amqp://',
include=['proj.tasks'])
if __name__ == '__main__':
上面的broker就是訊息儲存的位址 backend是儲存任務執**況的,比如正在執行,執行失敗, 已經執行結果. include表示執行的任務的**都放在哪個程式裡面,比如這裡的proj.tasks就是proj/tasks.py
from __future__ import absolute_import
def add(x, y):
return x + y
好吧 我們可以這樣啟動
proj 就是我們剛才應用的專案目錄
給我們的專案任務放到特定的佇列
可能你有很多的任務,但是你希望某些機器跑某些任務, 你可以希望有些任務優先順序比較高,而不希望 先進先出的等待. 那麼需要引入乙個佇列的問題. 也就是說在你的broker的訊息儲存裡面有一些佇列,他們並行執行,但是worker只從對應 的佇列裡面取任務.
我們要修改配置
from __future__ import absolute_import
from celery import celery
broker='amqp://myuser:mypassword@localhost:5672/vhost',
backend='amqp://',
include=['proj.tasks'])
celery_routes = ,},)
if __name__ == '__main__':
你會發現add這個函式任務被放在乙個叫做』hipri』的佇列裡面,想要執行那麼也需要改:
使用beat自動排程
想想吧. 目前還是互動模式去手動執行, 我們要是想crontab的定時生成和執行,那麼就是celery beat幹的事情
from datetime import timedelta
from celery import celery
broker='amqp://myuser:mypassword@localhost:5672/vhost',
backend='amqp://',
include=['proj.tasks'])
celery_routes = ,
},celerybeat_schedule = , },
)if __name__ == '__main__':
注意發現了乙個celerybeat_schedule,裡面的排程其實就是表示10秒生成一次,worker啟動方法一樣, 這裡啟動beat,他就是按時生成任務發到mq裡面,讓worker取走去執行
其實也可以在worker命令中加-b
剛才的celerybeat_schedule也可以使用crontab的風格,比如我說的沒3小時的12分就可以這樣:
celerybeat_schedule = ,}
python之celery簡單使用
參考 celery是乙個簡單 靈活和可靠的分布式任務處理系統。專注實時任務佇列,也支援任務排程。一 celery主要包括四個部分 1 任務排程者,2 中介軟體,傳遞任務 broker 常用的有redis rabbitmq 3 任務執行者 work 4 結果儲存 backend 儲存執行完成的結果,告...
Python之celery的簡介與使用
celery是乙個基於分布式訊息傳輸的非同步任務佇列,它專注於實時處理,同時也支援任務排程。它的執行單元為任務 task 利用多執行緒,如eventlet,gevent等,它們能被併發地執行在單個或多個職程伺服器 worker servers 上。任務能非同步執行 後台執行 或同步執行 等待任務完成...
深入Celery之使用佇列以及優先順序提高響應
多個佇列 celery預設使用的佇列名為celery預設繫結在direct交換機celery,可通過celery default queue celery default exchange celery default routing key等引數配置修改.usr bin env python co...