html
Celery是一個功能完備即插即用的異步任務隊列系統。它適用於異步處理問題,當發送郵件、或者文件上傳, 圖像處理等等一些比較耗時的操做,咱們可將其異步執行,這樣用戶不須要等待好久,提升用戶體驗。python
文檔:http://docs.jinkan.org/docs/celery/getting-started/index.htmlgit
github
redis
高效,單個celery進程每分鐘能夠處理數百萬個任務。django
靈活,celery中幾乎每一個部分均可以自定義擴展。api
任務隊列是一種跨線程、跨機器工做的一種機制.
任務隊列中包含稱做任務的工做單元。有專門的工做進程持續不斷的監視任務隊列,並從中得到新的任務並處理.
celery經過消息進行通訊,一般使用一個叫Broker(中間人)來協client(任務的發出者)和worker(任務的處理者). clients發出消息到隊列中,broker將隊列中的信息派發給worker來處理。
架構
一個celery系統能夠包含不少的worker和brokerapp
Celery自己不提供消息隊列功能,可是能夠很方便地和第三方提供的消息中間件進行集成,包括RabbitMQ,Redis,MongoDB等異步
pip install -U celery
tar xvfz celery-0.0.0.tar.gz cd celery-0.0.0 python setup.py build python setup.py install
通常celery任務目錄直接放在項目的根目錄下便可,路徑:
luffyapi/ ├── my_celery/ ├── config.py # 配置文件 ├── __init__.py ├── main.py # 主程序 └── sms/ # 一個目錄能夠放置多個任務,該目錄下存放當前任務執行時須要的模塊或依賴 └── tasks.py # 任務的文件,名稱必須是這個!!!
# 主程序 from celery import Celery # 建立celery實例對象 app = Celery("luffy") # 經過app對象加載配置 app.config_from_object("my_celery.config") # 自動搜索並加載任務 # 參數必須必須是一個列表,裏面的每個任務都是任務的路徑名稱 # app.autodiscover_tasks(["任務1","任務2",....]) app.autodiscover_tasks(["my_celery.sms","my_celery.cache"]) # 啓動Celery的命令 # 強烈建議切換目錄到項目的根目錄下啓動celery!! # celery -A my_celerymain worker --loglevel=info
# 任務隊列的連接地址 broker_url = 'redis://127.0.0.1:6379/15' # 結果隊列的連接地址 result_backend = 'redis://127.0.0.1:6379/14'
# celery的任務必須寫在tasks.py的文件中,別的文件名稱不識別!!! from my_celery.main import app @app.task # name表示設置任務的名稱,若是不填寫,則默認使用函數名作爲任務名 def send_sms(): print("發送短信!!!") @app.task(name="send_sms2") # name表示設置任務的名稱,若是不填寫,則默認使用函數名作爲任務名 def send_sms2(): print("發送短信任務2!!!")
celery -A my_celery.main worker --loglevel=info
# 調用celery執行異步任務 from my_celery.sms.tasks import send_sms send_sms.delay(mobile)
其餘參考文檔:
http://docs.celeryproject.org/en/latest/getting-started/introduction.html
https://github.com/celery/celery/tree/master/examples/django/
https://www.jianshu.com/p/1840035cb510