django使用定時(shí)任務(wù)django_apscheduler的實(shí)現(xiàn)
問(wèn)題:當(dāng)數(shù)據(jù)量過(guò)大,請(qǐng)求時(shí)間過(guò)長(zhǎng)的時(shí)候,使用django的緩存可以解決部分問(wèn)題,但是當(dāng)緩存數(shù)據(jù)過(guò)期時(shí)重新請(qǐng)求又是耗時(shí)的時(shí)間,請(qǐng)求時(shí)需要用戶等待。
解決:使用定時(shí)任務(wù)加緩存的方式,在后臺(tái)定時(shí)請(qǐng)求數(shù)據(jù)保存到緩存中,而對(duì)外的接口只負(fù)責(zé)讀取緩存的數(shù)據(jù)即可,這樣就不用再等待數(shù)據(jù)的請(qǐng)求了
django_apscheduler的運(yùn)行和django項(xiàng)目的運(yùn)行是相互獨(dú)立的,即使django項(xiàng)目停止,django_apscheduler也會(huì)繼續(xù)運(yùn)行
一、安裝及配置django_apscheduler
1,使用pip安裝django_apscheduler
pip install -i https://pypi.douban.com/simple django_apscheduler
2,settings.py中配置INSTALLED_APPS
在INSTALLED_APPS中添加django_apscheduler
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'rest_framework',
'course',
'django_apscheduler', # 添加
]3,生成遷移
python manage.py makemigrationspython manage.py migrate
遷移后生成兩張表

二、安裝及配置django_redis
1,使用pip安裝django_redis
pip install -i https://pypi.douban.com/simple django_redis
2,在settings.py中配置CACHES
# 配置緩存保存
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1', # 使用1號(hào)庫(kù)
}
}三、代碼
1,定時(shí)請(qǐng)求test_job函數(shù),請(qǐng)求獲取數(shù)據(jù)保存在redis緩存中
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
try:
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
@register_job(scheduler, "interval", seconds=10)
def test_job():
# 定時(shí)每5秒執(zhí)行一次
count = 0
courses = Course.objects.values('name')
for i in range(1000000):
for course in courses:
count += len(str(course["name"]))
cache.set("word_count", count, 10)
return JsonResponse({"count": count})
register_events(scheduler)
# 啟動(dòng)定時(shí)器
scheduler.start()
except Exception as e:
print('定時(shí)任務(wù)異常:%s' % str(e))2,定義接口,獲取保存的數(shù)據(jù)
class WordCountView(View):
def get(self, request):
word_count = cache.get("word_count")
if word_count:
return JsonResponse({"count": word_count})3,配置路由
path('count/', views.WordCountView.as_view())四、測(cè)試訪問(wèn)
1,啟動(dòng)django

2,查看redis:TTL為過(guò)期時(shí)間,每10秒過(guò)期,因?yàn)槎〞r(shí)任務(wù)也是10秒,所以就是每10秒自動(dòng)刷新一次

3,請(qǐng)求,時(shí)間只耗時(shí)5ms,正常請(qǐng)求在5秒左右

五、常見(jiàn)問(wèn)題
運(yùn)行報(bào)錯(cuò):Job identifier (course.views.test_job2) conflicts with an existing job

這是因?yàn)楝F(xiàn)有的工作id與數(shù)據(jù)庫(kù)的id相同導(dǎo)致的,手動(dòng)重要命名id即可

到此這篇關(guān)于django使用定時(shí)任務(wù)django_apscheduler的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)django 定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas.DataFrame的for循環(huán)迭代的實(shí)現(xiàn)
本文主要介紹了pandas.DataFrame的for循環(huán)迭代的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
python 刪除列表里所有空格項(xiàng)的方法總結(jié)
下面小編就為大家分享一篇python 刪除列表里所有空格項(xiàng)的方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
調(diào)試Python程序代碼的幾種方法總結(jié)
這篇文章主要介紹了調(diào)試Python程序代碼的幾種方法總結(jié),文中代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04
Pandas時(shí)間序列基礎(chǔ)詳解(轉(zhuǎn)換,索引,切片)
今天小編就為大家分享一篇Pandas時(shí)間序列基礎(chǔ)詳解(轉(zhuǎn)換,索引,切片),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python結(jié)合opencv實(shí)現(xiàn)人臉檢測(cè)與跟蹤
在Python下用起來(lái)OpenCV很爽,代碼很簡(jiǎn)潔,很清晰易懂。使用的是Haar特征的分類器,訓(xùn)練之后得到的數(shù)據(jù)存在一個(gè)xml中。下面我們就來(lái)詳細(xì)談?wù)劇?/div> 2015-06-06
在cmd中運(yùn)行.py文件: python的操作步驟
今天小編就為大家分享一篇在cmd中運(yùn)行.py文件: python的操作步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Django數(shù)據(jù)庫(kù)遷移常見(jiàn)使用方法
這篇文章主要介紹了Django數(shù)據(jù)庫(kù)遷移常見(jiàn)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11最新評(píng)論

