目前有个需求:任务需要定时执行,且是异步的。调研后,考虑 apscheduler,使用 apscheduler 中的 BlockingScheduler 满足需求。在编写代码的时候,任务中有数据库操作,运行时报错,如下图: 关键代码为:
scheduler.add_job(func=task_run, id="task_1", args=str(task_stream_id), trigger="date")
print(scheduler.get_jobs())
flask 相关的代码:
网上查了下,说时 flask 上下文的问题。本人 flask 新手,求助大家~感激不尽
1
killua67 2019-08-26 14:30:16 +08:00
图裂了
|
3
beyond99 2019-08-26 14:51:12 +08:00
这种好像要手动推入
with app.app_context(): // 这里做要做的事情 |
4
ytymf 2019-08-26 14:56:19 +08:00
感觉楼主的路走偏了,这种异步任务应该用任务队列来做,不应该用 apscheduler 吧。可以考虑一下用 celery
|
6
ytymf 2019-08-26 15:05:44 +08:00
@Raul7 这个不仅仅是简单不简单的问题。你的 flask 代码并不是一个单例,webserver 会根据访问情况启动多个 flask 实例。如果你是在业务代码中启动 apscheduler 的话,也会启动多个 apscheduler 的实例,定时任务就都乱了。 我疑似你的获取不到上下文,很可能就不是在一个进程中。
|
7
dearmymy 2019-08-26 15:12:56 +08:00
|
8
huahuajun9527 2019-08-26 15:15:59 +08:00
from flask import current_app
app = current_app._get_current_object() with app.app_context(): # do something pass |
9
Yuxiaoy 2019-08-26 15:21:29 +08:00 via Android
我用 flask apscheduler 的,直接看 github 的例子可以解决这个问题。但我在部署到 heroku 的时候发现没有按照预期的运行,不知道什么情况。
|
10
Raul7 OP @huahuajun9527 老哥,我试了下,我这边还是不行。代码如下:
def date_task(task_stream_id): app = current_app._get_current_object() with app.app_context(): scheduler.add_job(func=task_run, id="task_1", args=str(task_stream_id), trigger="date") scheduler.start() task_run 方法如下: def task_run(task_stream_id): log.write('info', None, 0, u'扫描任务调度开始') scan =xxx.Scan(task_stream_id) scan.start_scan() xxx 类中是 sql 查询。 |
11
huahuajun9527 2019-08-26 17:23:05 +08:00
|
12
lusi1990 2019-08-26 17:53:53 +08:00
这和简单复杂没关系,改用队列就要用,话说用队列也很简单啊
|
13
vZexc0m 2019-08-27 08:38:08 +08:00
|
14
Raul7 OP @huahuajun9527 谢谢老哥 用你这个方法搞定了
|