我在apscheduler中添加了一个作业,它在内存中加载了一些数据,我在作业完成后删除了所有对象。现在,如果我使用python运行这个作业,它会成功运行并且在进程成功退出后内存会丢失。但是在apscheduler的情况下,内存使用率不会下降。我正在使用BackgroundScheduler.Thanks提前。
答案 0 :(得分:1)
我通过apscheduler运行了很多任务。我怀疑此设置导致Heroku上出现R14错误,并导致动态内存过载,崩溃和每天重启。因此,我又启动了一个测功机,并安排了一些工作来频繁地非常运行。
通过查看Heroku中的“指标”标签,可以立即清楚地发现apscheduler是罪魁祸首。
向我推荐了Removing jobs after they're run。但这在运行cron和interval作业时当然是个坏主意,因为它们不会再次运行。
最终解决的方法是调整Github上的threadpoolexecutioner(减少最大工人数),see this answer on Stackoverflow和this和this帖子。我绝对建议您read the docs on this。
示例代码:
import logging
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
from apscheduler.schedulers.blocking import BlockingScheduler
from tests import overloadcheck
logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.DEBUG)
sched = BlockingScheduler(
executors={
'threadpool': ThreadPoolExecutor(max_workers=9),
'processpool': ProcessPoolExecutor(max_workers=3)
}
)
@sched.scheduled_job('interval', minutes=10, executor='threadpool')
def message_overloadcheck():
overloadcheck()
sched.start()
或者,如果您喜欢我的话,喜欢执行繁重的任务-尝试使用ProcessPoolExecutor作为ThreadPool的替代品或补充,但请确保在这种情况下从特定作业中调用它。
更新:而且,如果您想使用它,还需要导入ProcessPoolExecutor,并将其添加到代码中。
答案 1 :(得分:0)
以防万一有人使用 Flask-APScheduler 并遇到内存泄漏问题,我花了一段时间才意识到它希望任何配置设置都在您的 Flask Config 中,而不是在您实例化调度程序时。
所以如果你(像我一样)做了这样的事情:
from flask_apscheduler import APScheduler
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor
bg_scheduler = BackgroundScheduler(executors={'threadpool': ThreadPoolExecutor(max_workers=1)})
scheduler = APScheduler(scheduler=bg_scheduler)
scheduler.init_app(app)
scheduler.start()
那么无论出于何种原因,当作业在 Flask 请求上下文中运行时,它不会识别执行程序、“线程池”或您可能设置的任何其他配置设置。
但是,如果您在 Flask Config 类中将这些相同的选项设置为:
class Config(object):
#: Enable build completion checks?
SCHEDULER_API_ENABLED = True
#: Sets max workers to 1 which reduces memory footprint
SCHEDULER_EXECUTORS = {"default": {"type": "threadpool", "max_workers": 1}
# ... other Flask configuration options
然后执行(回到主脚本中)
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()
然后配置设置实际上做设置。我猜当我在原始脚本中调用 scheduler.init_app
时,Flask-APScheduler 发现我没有在 Flask Config 中设置任何这些设置,因此用默认值覆盖了它们,但不是 100% 确定。< /p>
无论如何,希望这可以帮助那些尝试过顶级答案但也使用 Flask-APScheduler 作为包装器并且可能仍会遇到内存问题的人。