django中使用celery及gevent

2021-09-02 14:57:49 字數 3485 閱讀 6793

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...