iT邦幫忙

2021 iThome 鐵人賽

DAY 25
1
自我挑戰組

Python 30天自我挑戰系列 第 25

Day25 - 使用Django-Q排程

到目前為止,小說追蹤功能已經差不多完成了,但現在小說只有在初次加入追蹤時會記錄相關資料。

為了能定期自動更新資料,我們將使用Django-Q,其可以達到排程、任務佇列(task queue)功能。

除了Django-Q外,Celery也是一個常被人使用的類似套件,但因為Django-Q在Django管理網站的使用介面對我而言比較便利,且我的需求也沒複雜到可以比較兩個套件的差異,故就暫時先不考慮使用Celery。

補充:在找資料的時候,在有看到一些比較早的討論有提到Django-Q在windows執行會發生問題,但並沒有一份正式文件有聲明其不支援windows,經過今天的測試也都沒問題,故可能此問題已在新版本修正。

安裝

Django-Q使用Redis做為消息代理 (message broker),故要使用Django-Q的話,執行環境必須事先安裝好Redis。

pip install django-q

環境設定

settings.py

在INSTALLED_APPS加入django_q,並另外加入Q_CLUSTER的設定,其中也包含了Redis的連線資訊:

INSTALLED_APPS = [
    'django_q',
]

# django-q configuration
Q_CLUSTER = {
    'name': 'django_q_bookhelper',
    'workers': 8,
    'recycle': 500,
    'timeout': 60,
    'compress': True,
    'save_limit': 250,
    'queue_limit': 500,
    'cpu_affinity': 1,
    'label': 'Django Q',
    'redis': {
        'host': '127.0.0.1',
        'port': 6379,
        'db': 0, }
}

完成設定後,執行migrate,更新資料庫。

加入排程

services.py

為了方便管理,另外新建services.py,裡面包含了待排程的相關功能:

from crawler.bookcrawler import BookCrawler
from datetime import datetime

from .models import Book

# function for schedule


def UpdateTrackInformation():
  booklist = Book.objects.filter(istrack=True)
  for book in booklist:

    crawler = BookCrawler(book.oriurl)
    crawler.getinfo()
    Book.objects.filter(bookid=book.bookid).update(title=crawler.title, totalsection=crawler.totalsection, bookstatus=crawler.bookstatus, updatetime=datetime.now())

使用管理網站加入排程

登入管理網站,現在出現了Django-Q的資料管理。
https://ithelp.ithome.com.tw/upload/images/20211007/2014188614WjfHtULc.png

選擇新增,加入剛剛完成的function。
https://ithelp.ithome.com.tw/upload/images/20211007/20141886pX56Q8LK8j.png

使用程式加入排程

Django-Q除了定時排程外,也可以用來處理非同步任務,在這個情境下,前面使用管理網站的方法就不敷使用。

使用程式碼的方法:

from django-q.task import async_task

async_task("track.services.UpdateTrackInformation")
# async_task(func, args)

啟動Django-Q

當以上設定完成後,除了啟動網站外,要另外啟動qcluster。

python manage.py qcluster

透過管理網站,可以簡單看到排程執行的狀況:
https://ithelp.ithome.com.tw/upload/images/20211007/201418862K0xXWmBiU.png


上一篇
Day24 - 權限控制
下一篇
Day26 - 部屬到正式環境 (1)
系列文
Python 30天自我挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言