Flask 中怎样用 while 写一个定时执行的任务?(定时查询最新数据)

2021-07-11 11:26:52 +08:00
 miniyao

用 before_app_first_request 的钩子,希望 app 首次启动时,开始运行一个每隔 1 小时定时查询最新数据的任务。结果发现这个任务每隔 1 小时去查询最新的数据,通过 flask_sqlalchemy 初始化之后的工厂模式,查询到的数据都是一样的。如下:


def async_cron_task(app):

with app.app_context():

while True:

new_user = User.query.order_by(User.reg_time.desc()).first()

print('New User: ', new_user.id)

time.sleep(3600)



def cron_task():

app = current_app._get_current_object()

thr = Thread(target=async_cron_task, args=[app])

thr.start()

return thr

但是,如果把数据库写成硬连接,就可以查到最新数据:


db = MySQLdb.connect(host='localhost', port=3306, user='xxx', passwd='xxx', db='xxx', charset='utf8')

cursor = db.cursor()

由于原生 SQL 查询语句太复杂了,希望用 SQLAlchemy 的方式连接数据库,要怎么样才能定时查到新数据呢?

4437 次点击
所在节点    Python
43 条回复
fhy1994
2021-07-12 08:14:52 +08:00
apscheduler
fansfans
2021-07-12 08:57:45 +08:00
我前几天刚好也遇到了类似的问题在接口中提交数据但是在线程池中的任务没有获取到对应的数据 应该是 sqlalchemy 的缓存问题 后面直接用 celery 了 调式控制都方便很多。
frostming
2021-07-12 09:01:53 +08:00
https://github.com/frostming/flask-crontab

用 crontab 运行周期任务,自动激活 app_context,减少代码量
wobuhuicode
2021-07-12 09:17:43 +08:00
定时任务用 crontab ~
RRRoger
2021-07-12 09:29:18 +08:00
可以试试改成自己调自己的接口
amoyiki
2021-07-12 09:39:52 +08:00
目前项目使用很多年 celery, 出现过屈指可数的程序问题。一般就是 redis 获取连接池失败。
不使用 celery 的话可以自己创建一个接口,外部 1h 调用一次。外部直接用 crontab 写定时
l4ever
2021-07-12 09:40:23 +08:00
用 flask-apscheduler
www5070504
2021-07-12 09:52:45 +08:00
丢到 apscheduler 里
wzwwzw
2021-07-12 09:54:29 +08:00
apscheduler flask 有插件
Vegetable
2021-07-12 10:33:49 +08:00
对自己好一点,apscheduler 吧
676529483
2021-07-12 10:36:04 +08:00
1. 你这个就是数据库连接处理有问题额,问题在 with app.app_context():这行,你应该想要使用 sqlalchemy 的连接初始化,要手动调用获取数据库连接
2. 我以前也这样自己处理,发现各种调度时间问题。现在更倾向于另启动一个 cron 服务,定时去调用 api 接口
nonduality
2021-07-12 10:40:17 +08:00
针对你的需求,要获取最新数据,用相关事件信号触发动作不是更直截了当还稳定可靠?
cz5424
2021-07-12 11:20:51 +08:00
看了一下的评论,猜测是事务的问题,同一个上下文里面会一直处于同一个事务,可重复读会一直读到相同数据,另一个方法是可以修改 sqlalchemy 的事务隔离级别来避免,不需要调换上下文和 while (代价是其他读写提交也会生效,慎重修改)
HUNYXV
2021-07-12 12:38:11 +08:00
```
pip install apscheduler
```
jianhua
2021-07-12 14:47:14 +08:00
搜索:flask + celery
Aether
2021-07-12 16:27:49 +08:00
@knightdf 一直在用 celery,没出过问题(好几年了)。你多研究下?
knightdf
2021-07-12 22:59:40 +08:00
@Aether 你回错人了?
myCupOfTea
2021-07-13 08:37:07 +08:00
apscheduler 有的时候会忽略任务,比如当前系统比较繁忙正好到了定时任务的时候
fansfans
2021-07-14 11:05:14 +08:00
@cz5424 我目前复现情况也听多的 技术在数据库中查询有数据 使用 sqlalchemy 依旧无法获取最新数据 。
yagamil
2021-07-15 08:35:20 +08:00
看着像脏读的问题. 每次用 sql 连接语句重连就不出现这个问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX