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


<<:  D22 - 彭彭的课程# Python 乱数与统计模组(2)

>>:  [Day22] 传值跟传参考概念

[Tableau Public] day 21:台湾姓氏分布-观察资料

找了一下发现在「内政资料开放平台」中有「10706全国乡镇市区前二十大姓人口数按性别」的资料集。 今...

Day.12 主从搭建 - 部署流程(Master Slave Replication )

了解昨天提到的主从运作流程後,今天来实际搭建主从架构~ 在前面我们起了一台VM当作Master,现在...

量化交易30天 Day29 - 整理量化交易相关学习资源

量化交易30天 本系列文章是纪录一位量化交易新手的学习过程,除了基础的Python语法不说明,其他...

Context Diagram 系统上下文图

系统上下文图 System Context Diagram (SCD) 是一种概念图的呈现,用於表达...

Day 13 ( 中级 ) 大型数字 ( 图形数字 )

大型数字 ( 图形数字 ) 教学原文参考:大型数字 ( 图形数字 ) 如果要在 Scratch 3 ...