IO密集型–使用多線程
計算密集型–使用多進程
一、celery
在web開發中,要給用戶發送郵件,發送短信,都屬於耗時的操作,會導致給用戶響應的時間變長。這種情況的解決辦法,就是給用戶先返回一個響應,不要影響用戶的使用。將這些耗時的操作,放在後臺執行,例如新開一個進程,celery就是用來處理這個問題的。
celery組成部分
- worker
- 工人,執行任務的單元
- broker
- 消息中間件,即中間人
- 用來在服務和worker中傳遞消息
- redis
- backend
- 用來存儲消息以及celery執行結果
Django封裝了celery,叫做django-celery
(一)django+celery+redis
Redis
使用cmd切換進解壓路徑
啓動
打開另一個cmd窗口,可使用
關閉
初始狀態是下標爲0的數據庫,切換數據庫
Redis中有16個數據庫
字符串類型
(二)Django的celery異步任務
和之前的開發相比,django-celery只是將任務發佈出去,處理耗時操作。比如發送郵件,發送短信,爬蟲,使用異步任務去實現,使得主進程不會阻塞。web服務只負責發起任務和接收任務的結果,中間執行的過程交給異步任務處理。
安裝註冊
pip install django-celery
pip install django-redis
pip install redis==2.10.6
配置
創建子應用,新建文件
在主項目下創建celery.py
編寫celery.py
編寫tasks.py任務文件
from __future__ import absolute_import
from Qshop.celery import app
# 創建任務
@app.task # 將普通的函數轉換爲celery任務
def test():
print('--------I am test task--------')
return 'I am test task'
進行數據遷移
啓動celery
python manage.py celery worker --loglevel=info
tasks.py
from __future__ import absolute_import
from Qshop.celery import app
import time
# 創建任務
@app.task # 將普通的函數轉換爲celery任務
def test():
time.sleep(2)
print('--------I am test task--------')
return 'I am test task'
@app.task
def myprint(name,age):
time.sleep(5)
print('%s:%s'%(name,age))
return 'I am myprint'
views.py
from CeleryTask.tasks import *
def reqtest(request):
# 執行celery任務
# test.delay() # 發佈任務
name = request.GET.get('name')
age = request.GET.get('age')
myprint.delay(name,age)
return HttpResponse('req test')
路由
(三)celery的定時任務
1.timedelta
配置
啓動定時任務
啓動之前,確保redis,worker啓動
python manage.py celerybeat --loglevel=info
2.crontab
crontab(hour='*/2') # 每隔兩個小時執行一次
crontab(minute=0,hour='*/2') # 每隔兩個小時的0分執行一次
crontab(minute = 0,hour="*/2,8-12") # 每隔兩小時或者是8到12點執行
crontab(minute = 0,hour=0,day_of_month="2-31/2") # 偶數天執行
crontab(minute = 0,hour=0,day_of_month="1" month_of_year="5") # 每年的5月1號 執行一次