Flask 中使用 APScheduler 应用上下文问题

2020-05-09 17:22:01 +08:00
 Ritter

没有使用 GitHub 上的 Flask-APScheduler 插件
自己写了一个类 在 add_job 的时候给 func 套了一层 里面添加了 flask 的应用上下文 如下

然后这是配置 任务存储用了 redis

调度器用的是 Gevent 的

但是运行的时候还是报了上下文外的错误

可是换成 MemoryJobStore 就不会报错(看了文档区别貌似是 MemoryJobStore 不会序列化 job, 难道是因为这个吗?)
有大佬遇到过类似的情况吗 或者说有其他方法向 job 添加 flask 应用上下文吗

2700 次点击
所在节点    Python
17 条回复
Ritter
2020-05-09 17:23:49 +08:00
Ritter
2020-05-09 17:31:12 +08:00
est
2020-05-09 17:37:43 +08:00
python 基于 wsgi 的 web 框架一律不要另外起 thread,或者任意其他异步任务。单独开个进程 worker
Ritter
2020-05-09 17:39:58 +08:00
@est 大佬意思是换成类似 celery 之类的异步任务框架吗
forrestshuang
2020-05-09 17:49:14 +08:00
@Ritter 要用进程,thread 会阻塞 掉
Ritter
2020-05-09 17:54:35 +08:00
@forrestshuang 我这个问题应该跟进程或者线程没什么关系吧。。。
est
2020-05-09 17:57:13 +08:00
@forrestshuang 单独的进程可以。子进程也有各种问题。


@Ritter 最好这样。
Latin
2020-05-09 17:57:32 +08:00
function 内部试试 current_app._get_current_object()
Latin
2020-05-09 17:57:48 +08:00
app = current_app._get_current_object()
Ritter
2020-05-09 18:07:27 +08:00
@est 我就是觉得 celery 太重了 所以才用 APScheduler 。。。

@Latin 不行 还是报一样的错误
est
2020-05-09 18:21:40 +08:00
@Ritter 新开一个进程跑 APS 任务。
Ritter
2020-05-09 18:32:06 +08:00
@est 这样的话 如果 flask 那边想 add_job 的话 应该怎么做
est
2020-05-09 18:39:01 +08:00
@Ritter redis 什么的倒手一下
Ritter
2020-05-09 18:51:36 +08:00
@est 这样感觉就有点麻烦了。。。 不过还是感谢大佬回复
wzwwzw
2020-05-09 19:20:09 +08:00
APScheduler 如果用 gunicorn 的话,会重复启动,我们现在采用的方案是 apscheduler 单独启动,使用 RPC 的模式交互。
lsvih
2020-05-09 19:28:08 +08:00
遇到过一样的问题,我绕了一下,单独用 apscheduler 执行命令把结果写到数据库,然后前端定时请求。。
so1n
2020-05-09 19:54:58 +08:00
最好还是把 Apscheduler 与 flask 解耦,不要一起运行

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

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

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

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

© 2021 V2EX