django使用定時任務django_apscheduler的實現(xiàn)
問題:當數(shù)據(jù)量過大,請求時間過長的時候,使用django的緩存可以解決部分問題,但是當緩存數(shù)據(jù)過期時重新請求又是耗時的時間,請求時需要用戶等待。
解決:使用定時任務加緩存的方式,在后臺定時請求數(shù)據(jù)保存到緩存中,而對外的接口只負責讀取緩存的數(shù)據(jù)即可,這樣就不用再等待數(shù)據(jù)的請求了
django_apscheduler的運行和django項目的運行是相互獨立的,即使django項目停止,django_apscheduler也會繼續(xù)運行
一、安裝及配置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號庫 } }
三、代碼
1,定時請求test_job函數(shù),請求獲取數(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(): # 定時每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) # 啟動定時器 scheduler.start() except Exception as e: print('定時任務異常:%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())
四、測試訪問
1,啟動django
2,查看redis:TTL為過期時間,每10秒過期,因為定時任務也是10秒,所以就是每10秒自動刷新一次
3,請求,時間只耗時5ms,正常請求在5秒左右
五、常見問題
運行報錯:Job identifier (course.views.test_job2) conflicts with an existing job
這是因為現(xiàn)有的工作id與數(shù)據(jù)庫的id相同導致的,手動重要命名id即可
到此這篇關于django使用定時任務django_apscheduler的實現(xiàn)的文章就介紹到這了,更多相關django 定時任務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中torch.load中的map_location參數(shù)使用
在PyTorch中,torch.load()函數(shù)是用于加載保存模型或張量數(shù)據(jù)的重要工具,map_location參數(shù)為我們提供了極大的靈活性,具有一定的參考價值,感興趣的可以了解一下2024-03-03Python中數(shù)字以及算數(shù)運算符的相關使用
這篇文章主要介紹了Python中數(shù)字以及算數(shù)運算符的相關使用,是Python入門學習中的基礎知識,需要的朋友可以參考下2015-10-10Python3.5內置模塊之time與datetime模塊用法實例分析
這篇文章主要介紹了Python3.5內置模塊之time與datetime模塊用法,結合實例形式分析了Python3.5 time與datetime模塊日期時間相關操作技巧,需要的朋友可以參考下2019-04-04Python Pyqt5多線程更新UI代碼實例(防止界面卡死)
這篇文章通過代碼實例給大家介紹了Python Pyqt5多線程更新UI防止界面卡死的問題,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-12-12