国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django - 定時(shí)任務(wù)框架【django-apscheduler】基本使用詳解(二)

這篇具有很好參考價(jià)值的文章主要介紹了Django - 定時(shí)任務(wù)框架【django-apscheduler】基本使用詳解(二)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一. 前言

一個(gè)網(wǎng)頁會(huì)有很多數(shù)據(jù)是不需要經(jīng)常變動(dòng)的,比如說首頁,變動(dòng)頻率低而訪問量大,我們可以把它靜態(tài)化,這樣就不需要每次有請(qǐng)求都要查詢數(shù)據(jù)庫再返回,可以減少服務(wù)器壓力
我們可以使用Django的模板渲染功能完成頁面渲染

二. APSchedule/django-apschedule簡(jiǎn)介

APScheduler的全稱是Advanced Python Scheduler。它是一個(gè)輕量級(jí)的 Python 定時(shí)任務(wù)調(diào)度框架。
APScheduler 支持三種調(diào)度任務(wù):

  • 固定時(shí)間間隔
  • 固定時(shí)間點(diǎn)(日期)
  • Linux 下的 Crontab命令。同時(shí),它還支持異步執(zhí)行、后臺(tái)執(zhí)行調(diào)度任務(wù)。

特點(diǎn)

1)可以動(dòng)態(tài)添加任務(wù)
2)不依賴Linux的crontab系統(tǒng)定時(shí)
3)可以對(duì)添加的定時(shí)任務(wù)做持久保存

之前已經(jīng)介紹過APScheduler的使用,下面介紹的是django-apscheduler的使用

三. 【django-apscheduler】使用

1.安裝APScheduler

 pip install django-apscheduler

2. 使用Django_apscheduler步驟

1.創(chuàng)建app

python manage.py startapp test

2. 注冊(cè)使用

settings.py中注冊(cè)django-apscheduler和test

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_apscheduler',
    'apps.test'	# 注意,我這里是在外層包了一個(gè)apps的文件夾,test為業(yè)務(wù)模塊
]

3.在test文件夾中新建urls.py

在子模塊apps/test/urls.py中添加如下代碼

from django.urls import path
from apps.test import views

urlpatterns = [
]

4. 在項(xiàng)目總路由urls.py中添加test.urls

打開djangoproject中的urls.py,輸入如下代碼

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('apps.test.urls')),
]

5. 執(zhí)行遷移

python manage.py makemigrations
python manage.py migrate

沒有其他表結(jié)構(gòu)的話不必運(yùn)行 python manage.py makemigrations
會(huì)創(chuàng)建兩張表:

  • django_apscheduler_djangojob
  • django_apscheduler_djangojobexecution

通過進(jìn)入后臺(tái)管理能方便管理定時(shí)任務(wù)。

django_apscheduler_djangojob 表保存注冊(cè)的任務(wù)以及下次執(zhí)行的時(shí)間
django定時(shí)任務(wù)框架,異步任務(wù),Django,python,django
這里注意 status為executed是執(zhí)行,missed 則是表示撞車的場(chǎng)景, 為避免這種場(chǎng)景需要在 周期的長(zhǎng)度以及是否進(jìn)行強(qiáng)制結(jié)束進(jìn)行選擇

6. 在test子應(yīng)用中的urls.py中輸入下面的代碼

from django.shortcuts import render

# Create your views here.
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job,DjangoResultStoreMixin

# 實(shí)例化調(diào)度器
scheduler = BackgroundScheduler()
# 開啟定時(shí)工作
# 調(diào)度器使用DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), "default")


# 設(shè)置定時(shí)任務(wù),選擇方式為interval,時(shí)間間隔為10s
# 另一種方式為每天固定時(shí)間執(zhí)行任務(wù),對(duì)應(yīng)代碼為:
# @register_job(scheduler, 'cron', day_of_week='mon-fri', hour='9', minute='30', second='10',id='task_time')
@register_job(scheduler, "interval", seconds=10,id='test_job', replace_existing=True)  # replace_existing=解決第二次啟動(dòng)失敗的問題
def my_job():
    # 這里寫你要執(zhí)行的任務(wù)
    pass

# register_events(scheduler)    最新的django_apscheduler已經(jīng)不需要這一步
scheduler.start()

最好為job加上id ,不加也可以

注意: 需要加上replace_existing=True 否則會(huì)報(bào)以下錯(cuò)誤,即id重複

raise ConflictingIdError(job.id)
apscheduler.jobstores.base.ConflictingIdError: 'Job identifier (index_html) conflicts with an existing job'

提示:也可以不寫在Django工程目錄下的urls.py文件中(主urls.py)或者子應(yīng)用的urls.py 中,百度說可以寫在view.py 中或其他隨便哪個(gè)文件中,但是我沒試成功過

7. 運(yùn)行django項(xiàng)目

python manage.py runserver 8000

常見的三種調(diào)度參數(shù)

  • date:希望在某個(gè)特定時(shí)間僅運(yùn)行一次作業(yè)時(shí)使用
  • interval:要以固定的時(shí)間間隔運(yùn)行作業(yè)時(shí)使用
  • cron:以crontab的方式運(yùn)行定時(shí)任務(wù)

3. 示例

from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job

scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")


# 時(shí)間間隔3秒鐘打印一次當(dāng)前的時(shí)間
@register_job(scheduler, "interval", seconds=3, id='test_job')
def test_job():
    print("我是apscheduler任務(wù)")
# per-execution monitoring, call register_events on your scheduler
register_events(scheduler)
scheduler.start()
print("Scheduler started!")

運(yùn)行結(jié)果

Scheduler started!
我是apscheduler任務(wù)
我是apscheduler任務(wù)
...

APScheduler中兩種調(diào)度器的區(qū)別及使用過程中要注意的問題

APScheduler中有很多種不同類型的調(diào)度器,BlockingScheduler與BackgroundScheduler是其中最常用的兩種調(diào)度器。區(qū)別主要在于BlockingScheduler會(huì)阻塞主線程的運(yùn)行,而BackgroundScheduler不會(huì)阻塞。所以,我們?cè)诓煌那闆r下,選擇不同的調(diào)度器:

  • BlockingScheduler: 調(diào)用start函數(shù)后會(huì)阻塞當(dāng)前線程。當(dāng)調(diào)度器是你應(yīng)用中唯一要運(yùn)行的東西時(shí)(如上例)使用
  • BackgroundScheduler: 調(diào)用start后主線程不會(huì)阻塞。當(dāng)你不運(yùn)行任何其他框架時(shí)使用,并希望調(diào)度器在你應(yīng)用的后臺(tái)執(zhí)行。

BlockingScheduler的示例

from apscheduler.schedulers.blocking import BlockingScheduler
import time

def job():
    print('job 3s')


if __name__=='__main__':

    sched = BlockingScheduler(timezone='MST')
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True):
        print('main 1s')
        time.sleep(1)

運(yùn)行結(jié)果

job 3s
job 3s
job 3s
...

可見,BlockingScheduler調(diào)用start函數(shù)后會(huì)阻塞當(dāng)前線程,導(dǎo)致主程序中while循環(huán)不會(huì)被執(zhí)行到。

BackgroundScheduler的例子

from apscheduler.schedulers.background import BackgroundScheduler
import time

def job():
    print('job 3s')


if __name__=='__main__':

    sched = BackgroundScheduler(timezone='MST')
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True):
        print('main 1s')
        time.sleep(1)

運(yùn)行結(jié)果

main 1s
main 1s
main 1s
job 3s
main 1s
main 1s
main 1s
job 3s
...

可見,BackgroundScheduler調(diào)用start函數(shù)后并不會(huì)阻塞當(dāng)前線程,所以可以繼續(xù)執(zhí)行主程序中while循環(huán)的邏輯。

通過這個(gè)輸出,我們也可以發(fā)現(xiàn),調(diào)用start函數(shù)后,job()并不會(huì)立即開始執(zhí)行。而是等待3s后,才會(huì)被調(diào)度執(zhí)行。

如何讓job在start()后就開始運(yùn)行

其實(shí)APScheduler并沒有提供很好的方法來解決這個(gè)問題,但有一種最簡(jiǎn)單的方式,就是在調(diào)度器start之前,就運(yùn)行一次job(),如下

from apscheduler.schedulers.background import BackgroundScheduler
import time

def job():
    print('job 3s')


if __name__=='__main__':
    job()
    sched = BackgroundScheduler(timezone='MST')
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True):
        print('main 1s')
        time.sleep(1)

這樣雖然沒有絕對(duì)做到讓job在start()后就開始運(yùn)行,但也能做到不等待調(diào)度,而是剛開始就運(yùn)行job

如果job執(zhí)行時(shí)間過長(zhǎng)會(huì)怎么樣

如果執(zhí)行job()的時(shí)間需要5s,但調(diào)度器配置為每隔3s就調(diào)用一下job(),會(huì)發(fā)生什么情況呢?我們寫了如下例子

from apscheduler.schedulers.background import BackgroundScheduler
import time

def job():
    print('job 3s')
    time.sleep(5)

if __name__=='__main__':

    sched = BackgroundScheduler(timezone='MST')
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True):
        print('main 1s')
        time.sleep(1)

django定時(shí)任務(wù)框架,異步任務(wù),Django,python,django
可見,3s時(shí)間到達(dá)后,并不會(huì)“重新啟動(dòng)一個(gè)job線程”,而是會(huì)跳過該次調(diào)度,等到下一個(gè)周期(再等待3s),又重新調(diào)度job()。

為了能讓多個(gè)job()同時(shí)運(yùn)行,我們也可以配置調(diào)度器的參數(shù)max_instances,如下例,我們?cè)试S2個(gè)job()同時(shí)運(yùn)行

from apscheduler.schedulers.background import BackgroundScheduler
import time

def job():
    print('job 3s')
    time.sleep(5)

if __name__=='__main__':
    job_defaults = { 'max_instances': 2 }
    sched = BackgroundScheduler(timezone='MST', job_defaults=job_defaults)
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True):
        print('main 1s')
        time.sleep(1)

我們可看到如下運(yùn)行結(jié)果
django定時(shí)任務(wù)框架,異步任務(wù),Django,python,django

每個(gè)job是怎么被調(diào)度的

通過上面的例子,我們發(fā)現(xiàn),調(diào)度器是定時(shí)調(diào)度job()函數(shù),來實(shí)現(xiàn)調(diào)度的。
那job()函數(shù)會(huì)被以進(jìn)程的方式調(diào)度運(yùn)行,還是以線程來運(yùn)行呢?
為了弄清這個(gè)問題,我們寫了如下程序:

from apscheduler.schedulers.background import BackgroundScheduler
import time,os,threading

def job():
    print('job thread_id-{0}, process_id-{1}'.format(threading.get_ident(), os.getpid()))
    time.sleep(50)

if __name__=='__main__':
    job_defaults = { 'max_instances': 20 }
    sched = BackgroundScheduler(timezone='MST', job_defaults=job_defaults)
    sched.add_job(job, 'interval', id='3_second_job', seconds=3)
    sched.start()

    while(True):
        print('main 1s')
        time.sleep(1)

我們可看到如下運(yùn)行結(jié)果
django定時(shí)任務(wù)框架,異步任務(wù),Django,python,django
可見,每個(gè)job()的進(jìn)程ID都相同,但線程ID不同。所以,job()最終是以線程的方式被調(diào)度執(zhí)行

BlockingScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn)

#BlockingScheduler定時(shí)任務(wù)
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
首先看看周一到周五定時(shí)執(zhí)行任務(wù)
# 輸出時(shí)間
def job():
  print(datetime.now().strtime("%Y-%m-%d %H:%M:%S"))
# BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(job, "cron", day_of_week="1-5", hour=6, minute=30)
schduler.start()
 
 
scheduler.add_job(job, 'cron', hour=1, minute=5)
hour =19 , minute =23  這里表示每天的1923 分執(zhí)行任務(wù)
hour ='19', minute ='23'  這里可以填寫數(shù)字,也可以填寫字符串
hour ='19-21', minute= '23'  表示 19:2320:23、 21:23 各執(zhí)行一次任務(wù)
 
#每300秒執(zhí)行一次
scheduler .add_job(job, 'interval', seconds=300)
 
#在1月,3月,5月,7-9月,每天的下午2點(diǎn),每一分鐘執(zhí)行一次任務(wù)
scheduler .add_job(func=job, trigger='cron', month='1,3,5,7-9', day='*', hour='14', minute='*')
 
# 當(dāng)前任務(wù)會(huì)在 6、7、8、11、12 月的第三個(gè)周五的 0、1、2、3 點(diǎn)執(zhí)行
scheduler .add_job(job, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')
 
#從開始時(shí)間到結(jié)束時(shí)間,每隔倆小時(shí)運(yùn)行一次
scheduler .add_job(job, 'interval', hours=2, start_date='2018-01-10 09:30:00', end_date='2018-06-15 11:00:00')
 
#自制定時(shí)器
 from datetime import datetime
 import time
 # 每n秒執(zhí)行一次
 def timer(n):
   while True:
     print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
     time.sleep(n)
 
timer(5)

BackgroundScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn)

啟動(dòng)異步定時(shí)任務(wù)
 import time
 from apscheduler.schedulers.background import BackgroundScheduler
 from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
 try: 
    # 實(shí)例化調(diào)度器
    scheduler = BackgroundScheduler()
    # 調(diào)度器使用DjangoJobStore()
    scheduler.add_jobstore(DjangoJobStore(), "default")
    # 'cron'方式循環(huán),周一到周五,每天9:30:10執(zhí)行,id為工作ID作為標(biāo)記
    # ('scheduler',"interval", seconds=1) #用interval方式循環(huán),每一秒執(zhí)行一次
    @register_job(scheduler, 'cron', day_of_week='mon-fri', hour='9', minute='30', second='10',id='task_time')
    def test_job():
      t_now = time.localtime()
      print(t_now)
  
   # 監(jiān)控任務(wù)
   register_events(scheduler)
   # 調(diào)度器開始
   scheduler.start()
except Exception as e:
  print(e)
  # 報(bào)錯(cuò)則調(diào)度器停止執(zhí)行
  scheduler.shutdown()

參考鏈接:https://www.cnblogs.com/guojie-guojie/p/16330165.html
以上就是python- 定時(shí)任務(wù)框架【APScheduler】基本使用介紹,希望對(duì)你有所幫助!文章來源地址http://www.zghlxwxcb.cn/news/detail-525888.html

到了這里,關(guān)于Django - 定時(shí)任務(wù)框架【django-apscheduler】基本使用詳解(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Django+Celery框架自動(dòng)化定時(shí)任務(wù)開發(fā)

    Django+Celery框架自動(dòng)化定時(shí)任務(wù)開發(fā)

    本章介紹使用DjCelery即Django+Celery框架開發(fā)定時(shí)任務(wù)功能,在Autotestplat平臺(tái)上實(shí)現(xiàn)單一接口自動(dòng)化測(cè)試腳本、業(yè)務(wù)場(chǎng)景接口自動(dòng)化測(cè)試腳本、App自動(dòng)化測(cè)試腳本、Web自動(dòng)化測(cè)試腳本等任務(wù)的定時(shí)執(zhí)行、調(diào)度、管理等,從而取代Jenkins上的定時(shí)執(zhí)行腳本和發(fā)送郵件等功能。** 自動(dòng)化

    2024年04月15日
    瀏覽(30)
  • 6.Flask-APScheduler定時(shí)任務(wù)框架

    Flask-APScheduler的參數(shù)包括:

    2024年02月10日
    瀏覽(34)
  • 軟件測(cè)試 | 測(cè)試開發(fā) | Django+Celery框架自動(dòng)化定時(shí)任務(wù)開發(fā)

    軟件測(cè)試 | 測(cè)試開發(fā) | Django+Celery框架自動(dòng)化定時(shí)任務(wù)開發(fā)

    ** 本章介紹使用DjCelery即Django+Celery框架開發(fā)定時(shí)任務(wù)功能,在Autotestplat平臺(tái)上實(shí)現(xiàn)單一接口自動(dòng)化測(cè)試腳本、業(yè)務(wù)場(chǎng)景接口自動(dòng)化測(cè)試腳本、App自動(dòng)化測(cè)試腳本、Web自動(dòng)化測(cè)試腳本等任務(wù)的定時(shí)執(zhí)行、調(diào)度、管理等,從而取代Jenkins上的定時(shí)執(zhí)行腳本和發(fā)送郵件等功能。** 自動(dòng)

    2023年04月08日
    瀏覽(27)
  • Python - 定時(shí)任務(wù)框架【APScheduler】基本使用詳解(一)

    一個(gè)網(wǎng)頁會(huì)有很多數(shù)據(jù)是不需要經(jīng)常變動(dòng)的,比如說首頁,變動(dòng)頻率低而訪問量大,我們可以把它靜態(tài)化,這樣就不需要每次有請(qǐng)求都要查詢數(shù)據(jù)庫再返回,可以減少服務(wù)器壓力 我們可以使用Django的模板渲染功能完成頁面渲染 APScheduler的全稱是Advanced Python Scheduler。它是一個(gè)

    2024年02月09日
    瀏覽(20)
  • django定時(shí)任務(wù)(django-crontab)

    django定時(shí)任務(wù)(django-crontab)

    目錄 一:安裝django-crontab: 二:添加django_crontab到你的INSTALLED_APPS設(shè)置: 三:運(yùn)行crontab命令來創(chuàng)建或更新cron作業(yè): 四:定義你的cron作業(yè) 五:創(chuàng)建你的管理命令: 六:重啟cron服務(wù): 在Django中,你可以使用多種方法來實(shí)現(xiàn)定時(shí)任務(wù)。其中,django-crontab是一個(gè)流行的第三方庫,

    2024年02月19日
    瀏覽(14)
  • Django項(xiàng)目定時(shí)任務(wù)django-crontab

    Django項(xiàng)目定時(shí)任務(wù)django-crontab

    ????????首先定義一個(gè)定時(shí)任務(wù)函數(shù)tasks.py(見文章末尾示例),編寫函數(shù),然后在setting.py中配置定時(shí)任務(wù) ????????1、首先安裝django-crontab ????????2、在setting.py中添加應(yīng)用 (在所有自定義注冊(cè)app之上) ????????在項(xiàng)目根路徑setting.py中設(shè)置定時(shí)任務(wù) ????????

    2024年04月11日
    瀏覽(14)
  • 如何在Django中使用django-crontab啟動(dòng)定時(shí)任務(wù)、關(guān)閉任務(wù)以及關(guān)閉指定任務(wù)

    安裝django-crontab包: 在Django項(xiàng)目的settings.py文件中,找到INSTALLED_APPS配置,并添加\\\'django_crontab\\\'到列表中: 在settings.py文件的末尾,添加以下配置以設(shè)置定時(shí)任務(wù)的時(shí)間間隔: 假設(shè)我們有一個(gè)名為myapp的應(yīng)用,其中定義了task1、task2和task3三個(gè)定時(shí)任務(wù)。具體參數(shù)設(shè)置看這里 在終端中

    2024年02月09日
    瀏覽(23)
  • Django實(shí)戰(zhàn)項(xiàng)目-學(xué)習(xí)任務(wù)系統(tǒng)-定時(shí)任務(wù)管理

    Django實(shí)戰(zhàn)項(xiàng)目-學(xué)習(xí)任務(wù)系統(tǒng)-定時(shí)任務(wù)管理

    接著上期代碼框架,開發(fā)第4個(gè)功能,定時(shí)任務(wù)管理,再增加一個(gè)學(xué)習(xí)定時(shí)任務(wù)表,主要用來設(shè)置周期重復(fù)性的學(xué)習(xí)任務(wù),定時(shí)周期,定時(shí)時(shí)間,任務(wù)標(biāo)題和內(nèi)容,預(yù)計(jì)完成天數(shù),獎(jiǎng)勵(lì)積分和任務(wù)狀態(tài)等信息。 現(xiàn)實(shí)中學(xué)習(xí)一門課程或一項(xiàng)技能知識(shí),需要很長(zhǎng)時(shí)間的學(xué)習(xí)積累才

    2024年02月08日
    瀏覽(15)
  • Django 如何使用 Celery 完成異步任務(wù)或定時(shí)任務(wù)

    以前版本的 Celery 需要一個(gè)單獨(dú)的庫(django-celery)才能與 Django 一起工作, 但從 Celery 3.1 開始,情況便不再如此,我們可以直接通過 Celery 庫來完成在 Django 中的任務(wù)。 以 Docker 安裝為例,安裝一個(gè)密碼為 mypassword 的 Redis 服務(wù)端 在 Django 項(xiàng)目中創(chuàng)建一個(gè) celery.py 文件,并配置

    2023年04月25日
    瀏覽(17)
  • 利用Django和Celery管理定時(shí)任務(wù)

    同步發(fā)表于個(gè)人站點(diǎn): http://panzhixiang.cn/article/2023/3/16/68.html 我們以前一直使用k8s的cronjob來管理定時(shí)任務(wù)的。把定時(shí)任務(wù)相關(guān)的代碼單獨(dú)封裝成一個(gè)pod,然后以cronjob的方法來觸發(fā)。 雖然這個(gè)方法操作很簡(jiǎn)單,沒有什么第三方資源的依賴(比如Redis),但是也有一個(gè)明顯的缺點(diǎn)

    2024年02月07日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包