【Python】django-celery非同步任務佇列
Django中如何使用django-celery完成非同步任務
安裝Celery
我們可以使用pip在vietualenv中安裝:
pip install django-celery celerydjango 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日誌,返回結果
手工測試task
- 開啟新的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模式
-
Eager模式
-
- 如果在settings.py設定:
-
CELERY_ALWAYS_EAGER = True
- 那麼Celery便以eager模式執行, 則task便不需要加delay執行:
-
# 若啟用eager模式, 則以下兩行程式碼相同
-
add.delay(2, 2)
- add(2, 2)
dj-celery 定時任務
-
settings配置新增
-
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時任務
-
-
CELERYBEAT_SCHEDULE = {
-
'add-every-3-seconds': {
-
'task': 'apps.task.pp',
-
'schedule': timedelta(seconds=3) ---每隔3秒 執行task下的pp函式
-
},
- }
如果需要傳參可以這樣寫
-
CELERYBEAT_SCHEDULE = {
-
'add-every-3-minutes': {
-
'task': 'apps.task.add',
-
'schedule': timedelta(seconds=3),
-
'args': (16, 16)
-
},
- }
-
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時任務
-
啟動celery beat
-
啟動beat
-
執行定時任務時, Celery會透過celerybeat程式來完成. Celerybeat會保持執行, 一旦到了某一定時任務需要執行時, Celerybeat便將其加入到queue中. 不像worker程式, Celerybeat只有需要一個即可.
- 啟動:
-
python manage.py celery beat --loglevel=info
- 其實還有一種簡單的啟動方式worker和beat一起啟動:
- python manage.py celery worker --loglevel=info --beat
-
啟動beat
-
檢視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'
-
[2017-11-10 16:17:25,853: INFO/MainProcess] Received task: apps.task.pp[8a3af6fb-5189-4647-91f2-8aa07489dd1e]
- 參考文件:
-
http://www.codeweblog.com/djcelery%E5%85%A5%E9%97%A8-%E5%AE%9E%E7%8E%B0%E8%BF%90%E8%A1%8C%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1/
django-celery參考文件:
http://blog.csdn.net/acm_zl/article/details/53188064
https://www.cnblogs.com/znicy/p/5626040.html
http://www.weiguda.com/blog/73/
https://www.cnblogs.com/Lin-Yi/p/7590971.html
補充還有另外一種方法那就是celery
-
具體配置可見參考
- http://www.jianshu.com/p/7a869a73b92f
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2147120/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python多執行緒非同步任務佇列(例項)Python執行緒非同步佇列
- Celery任務佇列佇列
- 任務佇列,巨集任務與微任務佇列
- Swoole來實現實時非同步任務佇列非同步佇列
- 基於Django與Celery實現非同步佇列任務Django非同步佇列
- Python中任務佇列-芹菜celery的使用Python佇列
- js定時任務佇列JS佇列
- Procrastinate:基於PostgreSQL的Python任務佇列ASTSQLPython佇列
- coleifer/huey:python 的一個小任務佇列Python佇列
- Hatchet:Python中分散式、容錯任務佇列Python分散式佇列
- 總結:JavaScript非同步、事件迴圈與訊息佇列、微任務與巨集任務JavaScript非同步事件佇列
- Redis實現任務佇列、優先順序佇列Redis佇列
- 淺談JS阻塞方式怎麼實現非同步任務佇列?JS非同步佇列
- 事件迴圈與任務佇列事件佇列
- 如何寫一個任務佇列佇列
- javascript事件環微任務和巨集任務佇列原理JavaScript事件佇列
- centos(php7)下gearman實現非同步處理佇列任務CentOSPHP非同步佇列
- 怎樣實現一個非阻塞的超時重試任務佇列佇列
- 基於asyncio和redis的Python分散式任務佇列RedisPython分散式佇列
- 簡單易用的任務佇列-beanstalkd佇列Bean
- iOS-佇列.執行緒.任務iOS佇列執行緒
- (轉)開源的任務佇列服務HTQ佇列
- 一個執行定時任務(Crontab)和任務佇列(Taskqueue)的 Python 小工具佇列Python
- OkHttp3原始碼分析[任務佇列]HTTP原始碼佇列
- OkHttp 3.7原始碼分析(三)——任務佇列HTTP原始碼佇列
- 如何理解 JS 非同步程式設計的,EventLoop、訊息佇列,什麼是巨集任務,什麼是微任務?JS非同步程式設計OOP佇列
- 大量佇列任務總是 MaxAttemptsExceededException,怎麼辦?佇列Exception
- OkHttp3.7原始碼分析(三)——任務佇列HTTP原始碼佇列
- Redis 分散式鎖與任務佇列實戰Redis分散式佇列
- synchronized 中的同步佇列與等待佇列synchronized佇列
- Python 30 行程式碼實現小型多執行緒任務佇列Python行程執行緒佇列
- 詳解JavaScript的任務、微任務、佇列以及程式碼執行順序JavaScript佇列
- Laravel 佇列重複執行同一個任務Laravel佇列
- Laravel5.7 清除 Redis 驅動的佇列任務LaravelRedis佇列
- 分散式任務 + 訊息佇列框架 go-queue分散式佇列框架Go
- 用 RabbitMQ 的死信佇列來做定時任務MQ佇列
- 任務與佇列 iOS之多執行緒GCD(一)佇列iOS執行緒GC
- Java幾種執行緒池及任務佇列Java執行緒佇列