到目前為止,小說追蹤功能已經差不多完成了,但現在小說只有在初次加入追蹤時會記錄相關資料。
為了能定期自動更新資料,我們將使用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
在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,裡面包含了待排程的相關功能:
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的資料管理。
選擇新增,加入剛剛完成的function。
Django-Q除了定時排程外,也可以用來處理非同步任務,在這個情境下,前面使用管理網站的方法就不敷使用。
使用程式碼的方法:
from django-q.task import async_task
async_task("track.services.UpdateTrackInformation")
# async_task(func, args)
當以上設定完成後,除了啟動網站外,要另外啟動qcluster。
python manage.py qcluster
透過管理網站,可以簡單看到排程執行的狀況: