您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Django中如何使用django-celery完成異步任務 ,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Django中如何使用django-celery完成異步任務
我們可以使用pip在vietualenv中安裝:
pip install django-celery celery
django settings設置
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/2' ---使用redis當消息隊列
注冊
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'devops',
'apps',
'common',
'djcelery',
]
在apps下創建一個task.py文件
from celery import task
@task
def add(x, y):
return x + y
@task
def pp():
return 'ffffffffffffffffffffff'
返回settings將其導入進去
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/2'
CELERY_IMPORTS = ('apps.task')
隨意選個views中的方法調用改task測試下
#項目列表
def project_list(request):
admin = Admin.objects.get(id=get_current_admin_id(request))
pt=admin.projects.all().order_by('-id')
from apps import task
tt=task.add.delay(2,2)
print 'vvvvvvvvvvvvvvvvvvvv',tt -----訪問該功能時調用task的add方法
page_objects = pages(pt, request, 5) ##分頁
return render_to_response('project/project_list.html',locals())
安裝啟動redis:略
啟動runserver 與 celery
python manage.py runserver
python manage.py celery worker --loglevel=info
[2017-11-10 14:55:17,016: INFO/MainProcess] Task apps.task.add[9bafe6d2-8411-4f5f-8eed-10444da0ae3a] succeeded in 0.00280212797225s: 4 --可以看到worker日志,返回結果 打開新的terminal, 激活virtualenv, 并切換到django項目目錄:
$ python manage.py shell
>>> from apps.task 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]
[2014-10-07 08:47:08,299: INFO/MainProcess] Task myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc] succeeded in 0.183349132538s: 4 Eager模式
如果在settings.py設置:
CELERY_ALWAYS_EAGER = True
那么Celery便以eager模式運行, 則task便不需要加delay運行:
# 若啟用eager模式, 則以下兩行代碼相同
add.delay(2, 2)
add(2, 2)
settings配置添加 CELERYBEAT_SCHEDULE = {
'add-every-3-minutes': {
'task': 'apps.task.add',
'schedule': timedelta(seconds=3),
'args': (16, 16)
},
} CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時任務
CELERYBEAT_SCHEDULE = {
'add-every-3-seconds': {
'task': 'apps.task.pp',
'schedule': timedelta(seconds=3) ---每隔3秒 執行task下的pp函數
},
}
啟動celery beat
其實還有一種簡單的啟動方式worker和beat一起啟動:
python manage.py celery worker --loglevel=info --beat 啟動beat
執行定時任務時, Celery會通過celerybeat進程來完成. Celerybeat會保持運行, 一旦到了某一定時任務需要執行時, Celerybeat便將其加入到queue中. 不像worker進程, Celerybeat只有需要一個即可.
啟動:
python manage.py celery beat --loglevel=info
查看worker日志 [2017-11-10 16:17:25,853: INFO/MainProcess] Received task: apps.task.pp[8a3af6fb-5189-4647-91f2-8aa07489dd1e] [2017-11-10 16:17:25,858: INFO/MainProcess] Task apps.task.pp[8a3af6fb-5189-4647-91f2-8aa07489dd1e] succeeded in 0.00379144400358s: 'ffffffffffffffffffffff' [2017-11-10 16:17:28,858: INFO/MainProcess] Received task: apps.task.pp[d87e4ea0-8881-449a-b993-e7657f50ef25] [2017-11-10 16:17:28,864: INFO/MainProcess] Task apps.task.pp[d87e4ea0-8881-449a-b993-e7657f50ef25] succeeded in 0.0049942266196s: 'ffffffffffffffffffffff' [2017-11-10 16:17:31,859: INFO/MainProcess] Received task: apps.task.pp[4d05b4f3-92ff-4922-a8f4-7e047749239a] [2017-11-10 16:17:31,865: INFO/MainProcess] Task apps.task.pp[4d05b4f3-92ff-4922-a8f4-7e047749239a] succeeded in 0.00537821277976s: 'ffffffffffffffffffffff' [2017-11-10 16:17:34,859: INFO/MainProcess] Received task: apps.task.pp[5b21afc1-ebf1-4858-be68-20b9bf318452] [2017-11-10 16:17:34,865: INFO/MainProcess] Task apps.task.pp[5b21afc1-ebf1-4858-be68-20b9bf318452] succeeded in 0.00530335493386s: 'ffffffffffffffffffffff'
訪問對應的頁面看日志
手工測試task
Eager模式
dj-celery 定時任務
如果需要傳參可以這樣寫
補充還有另外一種方法那就是celery
上述就是小編為大家分享的Django中如何使用django-celery完成異步任務 了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。