定时修正统计数据1------apscheduler独立运行,以阻塞方式运行
新建/scheduler/包路径
新建/scheduler/main.py文件
import sys import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(BASE_DIR, 'common')) sys.path.insert(0, os.path.join(BASE_DIR)) from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.executors.pool import ProcessPoolExecutor # 创建一个apscheduler调度器对象 # 配置调度器对象使用的 任务存储后端 执行器(进程、线程) executors = { # 表示默认到了时间,该执行的定时任务都是放到进程池中的一个子进程执行 # 3表示进程池中最多有3个进程,也就说 在同一时刻,最多 有3个进程同时执行 'default': ProcessPoolExecutor(3) } # Blocking 阻塞的调度 scheduler = BlockingScheduler(executors=executors) import common # 添加定时任务 # 在每天的凌晨3点执行 from statistic import fix_statistics scheduler.add_job(fix_statistics, 'cron', hour=3) # 测试使用这个触发时间,在scheduler启动的使用执行一次定时任务 # scheduler.add_job(fix_statistics, 'date') # 启动scheduler if __name__ == '__main__': # start()会阻塞当前文件退出 scheduler.start()
新建/scheduler/statistic.py文件
from sqlalchemy import func from flask import current_app from models.news import Article from models import db from cache import statistic as cache_statistic from common import flask_app def __fix_statistics(cls): # 进行数据库查询 with flask_app.app_context(): ret = cls.db_query() # 将数据库查询结果设置到redis中 cls.reset(ret) def fix_statistics(): """ 修正redis中存储的统计数据 定时任务 :return: """ # 查询数据库得到统计数据 # class UserArticlesCountStorage(CountStorageBase): # """ # 用户文章数量 # """ # key = 'count:user:arts' zset 4,1 # sql # select user_id, count(article_id) from news_article_basic where status=2 group by user_id # ret = db.session.query(Article.user_id, func.count(Article.id))\ # .filter(Article.status == Article.STATUS.APPROVED)\ # .group_by(Article.user_id).all() # ret -> [ # ( 1, 46141), # (2, 46357 ), # (3 ,46187) # ] # # 设置redis的存储记录 # pl = current_app.redis_master.pipeline() # pl.delete('count:user:arts') # # # zadd(key, score1, val1, score2, val2, ...) # for user_id, count in ret: # pl.zadd('count:user:arts', count, user_id) # # pl.execute() __fix_statistics(cache_statistic.UserArticleCountStorage) __fix_statistics(cache_statistic.UserFollowingCountStorage) __fix_statistics(cache_statistic.ArticleCollectingCountStorage) __fix_statistics(cache_statistic.UserArticleCollectingCountStorage)
新建/scheduler/comment.py文件---->防止文件statistic.py与main.py文件循环调用
# 创建定时任务中需要使用到的数据库对象和redis对象 # 可以通过调用create_app 方法,创建flask app的时候,此方法会连带初始化数据库db对象和redis对象 from toutiao import create_app from settings.default import DefaultConfig flask_app = create_app(DefaultConfig, enable_config_file=True)
进入服务器系统运行文件执行
python main.py
壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。
于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。
苏子愀然,正襟危坐而问客曰:“何为其然也?”客曰:“月明星稀,乌鹊南飞,此非曹孟德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,此非孟德之困于周郎者乎?方其破荆州,下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉?况吾与子渔樵于江渚之上,侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽以相属。寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。”
苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!且夫天地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”
客喜而笑,洗盏更酌。肴核既尽,杯盘狼籍。相与枕藉乎舟中,不知东方之既白。

浙公网安备 33010602011771号