多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Django中如何使用django-celery完成異步任務

Django中如何使用django-celery完成異步任務

來源:程序員人生   發布時間:2015-04-24 07:57:33 閱讀次數:8541次

本篇博文主要介紹在開發環境中的celery使用,請勿用于部署服務器.

許多Django利用需要履行異步任務, 以便不耽誤http request的履行. 我們也能夠選擇許多方法來完成異步任務, 使用Celery是1個比較好的選擇, 由于Celery有著大量的社區支持, 能夠完善的擴大, 和Django結合的也很好. Celery不但能在Django中使用, 還能在其他地方被大量的使用. 因此1旦學會使用Celery, 我們可以很方便的在其他項目中使用它.

1. Celery版本

本篇博文主要針對Celery 3.0.x. 初期版本的Celery可能有細微的差別.

2. Celery介紹

Celery的主要用途是履行異步任務, 可以選擇延期或定時履行功能. 為何需要履行異步任務呢?

第1, 假定用戶正發起1個request, 并等待request完成后返回. 在這1request后面的view功能中, 我們可能需要履行1段花費很長時間的程序任務, 這1時間可能遠遠大于用戶能忍耐的范圍. 當這1任務其實不需要立刻履行時, 我們即可以使用Celery在后臺履行, 而不影響用戶閱讀網頁. 當有任務需要訪問遠程服務器完成時, 我們常常都沒法肯定需要花費的時間.

第2則是定期履行某些任務. 比如每小時需要檢查1下天氣預報, 然后將數據貯存到數據庫中. 我們可以編寫這1任務, 然后讓Celery每小時履行1次. 這樣我們的web利用便能獲得最新的天氣預報信息.

我們這里所講的任務task, 就是1個Python功能(function). 定期履行1個任務可以被認為是延時履行該功能. 我們可使用Celery延遲5分鐘調用function task1, 并傳入參數(1, 2, 3). 或我們也能夠每天午夜運行該function.

我們偏向于將Celery放入項目中, 便于task訪問統1數據庫和Django設置.

當task準備運行時, Celery會將其放入列隊queue中. queue中貯存著可以運行的task的list. 我們可使用多個queue, 但為了簡單, 這里我們只使用1個.

將任務task放入queue就像加入todo list1樣. 為了使task運行, 我們還需要在其他線程中運行的苦工worker. worker實時視察著代運行的task, 并逐1運行這些task. 你可使用多個worker, 通常他們位于不同服務器上. 一樣為了簡單起見, 我們這只是用1個worker.

我們稍后會討論queue, worker和另外1個10分重要的進程, 接下來我們來動動手:

3. 安裝Celery

我們可使用pip在vietualenv中安裝:

pip install django-celery

4. Django設置

我們暫時使用django runserver來啟動celery. 而Celery代理人(broker), 我們使用Django database broker implementation. 現在我們只需要知道Celery需要broker, 使用django本身即可以充當broker. (但在部署時, 我們最好使用更穩定和高效的broker, 例如Redis.)

在settings.py中:

import djcelery djcelery.setup_loader() BROKER_URL = 'django://' ... INSTALLED_APPS = ( ... 'djcelery', 'kombu.transport.django', ... )

第12項是必須的, 第3項則告知Celery使用Django項目作為broker.

在INSTALLED_APPS中添加的djcelery是必須的. kombu.transport.django則是基于Django的broker

最后創建Celery所需的數據表, 如果使用South作為數據遷移工具, 則運行:

python manage.py migrate

否則運行: (Django 1.6或Django 1.7都可以)

python manage.py syncdb

5. 創建1個task

正如前面所說的, 1個task就是1個Pyhton function. 但Celery需要知道這1function是task, 因此我們可使用celery自帶的裝潢器decorator: @task. 在django app目錄中創建taske.py:

from celery import task @task() def add(x, y): return x + y

當settings.py中的djcelery.setup_loader()運行時, Celery便會查看所有INSTALLED_APPS中app目錄中的tasks.py文件, 找到標記為task的function, 并將它們注冊為celery task.

將function標注為task其實不會妨礙他們的正常履行. 你還是可以像平時那樣調用它: z = add(1, 2).

6. 履行task

讓我們以1個簡單的例子作為開始. 例如我們希望在用戶發出request后異步履行該task, 馬上返回response, 從而不阻塞該request, 使用戶有1個流暢的訪問進程. 那末, 我們可使用.delay, 例如在在views.py的1個view中:

from myapp.tasks import add ... add.delay(2, 2) ...

Celery會將task加入到queue中, 并馬上返回. 而在1旁待命的worker看到該task后, 便會依照設定履行它, 并將他從queue中移除. 而worker則會履行以下代碼:

import myapp.tasks.add myapp.tasks.add(2, 2)

7. 關于import

這里需要注意的是, 在impprt task時, 需要保持1致. 由于在履行djcelery.setup_loader()時, task是以INSTALLED_APPS中的app名, 加.tasks.function_name注冊的, 如果我們由于python path不同而使用不同的援用方式時(例如在tasks.py中使用from myproject.myapp.tasks import add情勢), Celery將沒法得知這是同1task, 因此可能會引發奇怪的bug.

8. 測試

a. 啟動worker

正如之前說到的, 我們需要worker來履行task. 以下是在開發環境中的如何啟動worker:

首先啟動terminal, 猶如開發django項目1樣, 激活virtualenv, 切換到django項目目錄. 然后啟動django自帶web服務器: python manage.py runserver.

然后啟動worker:

如果用gevent需要加參數-P gevent

python manage.py celery worker --loglevel=info

此時, worker將會在該terminal中運行, 并顯示輸出結果.

b. 啟動task

打開新的terminal, 激活virtualenv, 并切換到django項目目錄:

$ python manage.py shell >>> from myapp.tasks import add >>> add.delay(2, 2)

此時, 你可以在worker窗口中看到worker履行該task:

[2014-10-07 08:47:08,076: INFO/MainProcess] Got task from broker: myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc] 生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲成人网在线 | 亚洲乱码在线观看 | 国产高清一区二区三区免费视频 | 色悠久久久久综合欧美99 | 麻豆久久精品免费看国产 | 欧美另类激情 | 97久久精品午夜一区二区 | 台湾成人性视频免费播放 | 久久九九久精品国产 | 99久久久国产精品免费牛牛四川 | 欧美在线观看a | 成人精品一区二区不卡视频 | 国产人人澡 | 黑人一区二区三区中文字幕 | 国产一区亚洲欧美成人 | 国产 日韩 一区 | 一级特黄欧美 | 综合网小说图片区 | 亚洲国产成人精彩精品 | 国产精品福利网站 | 又污又黄又无遮挡网站 | 在线视频精品视频 | 亚洲在线高清 | 欧美一级毛片久久精品 | 国产精品国产三级国产 | 欧美午夜理伦三级理论三级 | 最新更新国内自拍视频 | 92精品国产自产在线观看 | 一区二区三区四区无限乱码 | 亚洲成人综合网站 | 国产婷婷一区二区在线观看 | 欧美久久综合网 | 国产高清在线免费观看 | 日本亚洲成高清一区二区三区 | 国产成人一区二区三区在线视频 | 欧美最猛黑人xxxx | 欧美一级毛片欧美一级成人毛片 | 男女污污的视频 | 亚洲精品国产精品国自产观看 | 色老成人精品视频在线观看 | 91欧美激情一区二区三区成人 |