celery是分布式非同步任務佇列,通過在django中整合celery任務,可實現工作流的定製、非同步執行i/o工作量大的任務、定時任務。下面的例子,給出了定時任務的實現過程。原始碼:
django-admin startproject mysite
在mysite下建立poll應用
2、建立後mysite的目錄結構如下:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
polls/
__init__.py
admin.py
migrations/
models.py
tests.py
views.py
3、修改mysite/mysite/settings.py中增加celery配置:
import djcelery
djcelery.setup_loader(
)broker_url=
"redis:"
celery_result_backend=broker_url
celery_accept_content=
['json'
]celery_task_serializer=
'json'
celery_result_serializer=
'json'
celerybeat_scheduler=
'djcelery.schedulers.databasescheduler'
celery_timezone=
'asia/shanghai'
4、在mysite/mysite/下新增celery.py:
from __future__ import absolute_import
import os
from celery import celery
from django.conf import settings
os.environ.setdefault(
'django_settings_module'
,'mysite.settings'
)'test'
)'django.conf:settings'
)lambda
5、在mysite/polls/目錄下增加tasks.py:
from celery import task
import time
@task
defadd
(*args)
: time.sleep(30)
return args[0]
+ args[
1]
[
'django.contrib.admin'
,'django.contrib.auth'
,'django.contrib.contenttypes'
,'django.contrib.sessions'
,'django.contrib.messages'
,'django.contrib.staticfiles'
,'djcelery'
,'polls'
]7、執行django和celery:
python manage.py runserver 0.0.0.0:8000
python manage.py celery worker -a mysite.celery -l debug -f celery.log -b
8、一開始執行時,celery自動突出了,通過celery.log日誌發現報如下錯:
attributeerror: 'unicode' object has no attribute 'iteritems'
在網上搜了一圈,發現類似問題,是redis版本問題,出錯版本為3.0.1,回滾到2.10.6(pip install redis==2.10.6)就好了
9、通過redis客戶端可以看到,任務定時觸發,並保持執行結果在redis中:
查詢某個任務執行結果:
127.0.0.1:6379> get "celery-task-meta-d5fa1dc2-4f7a-4dcc-a65f-9017b92d509e"
""
gevent是通過greenlet實現協程,通過在io操作時自動切換至其他協程,來提高程式併發效能。繼續在上面的例子中,增加gevent的**。
1、在上面的polls/tasks.py中增加乙個同步任務sync(執行add函式6次)和乙個併發執行的任務async(執行add函式六次):
import gevent
@task
defasync()
: b = time.time(
) p =
for i in
range(6
):) gevent.joinall(p)
e = time.time(
)print
'async cost time: %s'
%(e-b)
@task
defsync()
: b = time.time(
)for i in
range(6
):add(i, i)
e = time.time(
)print
'sync cost time: %s'
%(e-b)
2、修改mysite/mysite/settings.py,增加同步和非同步任務:
celerybeat_schedule =
,'async-10-seconds':,
'sync-10-seconds':,
}
3、執行django和celery,檢視celery日誌,得到單次async和sync的執行時長:
[2018-12-09 14:36:23,795: warning/worker-2] async cost time: 180.015712023
[2018-12-09 14:36:23,797: warning/worker-4] sync cost time: 180.006083012
上面的例子舉的不是很好,可以看看下面這篇中的例子:
這篇文章介紹gevent比較詳細
django中使用celery 一
建立django專案celery demo,建立應用demo 在celery demo模組中建立celery.py模組,檔案目錄為 celery.py模組內容為 from celery import celery from django.conf import settings import os ...
在django中使用 配置 celery
通俗來說,celery是python的乙個非同步佇列伺服器。在我們日常web應用中,當請求乙個後端介面的時候,都是等待該介面的業務完成後再返回。那麼如果這個介面執行的任務很漫長,就可能造成服務阻塞甚至http請求超時。那麼如果web介面要執行很長時間的任務,又要保證即時給前端響應,就可以將很耗時間的...
在django中使用celery非同步任務和定時任務
在django中使用 celery django版本 1.9.8 pip install django celery redis要指定版本,預設的 3.x版本有問題 pip uninstall redis pip install redis 2.10.6 建立django的 並配置執行起來,作為 c...