栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

确保只有一个工作进程在运行多个工作进程的金字塔web应用程序中启动apscheduler事件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

确保只有一个工作进程在运行多个工作进程的金字塔web应用程序中启动apscheduler事件

由于Gunicorn开始用8名工人(在你的例子),这fork了该程序8次进8点的过程。这8个流程是从Master流程派生的,Master流程监视每个流程的状态并具有添加/删除工作人员的能力。

每个进程都会获取你的APScheduler对象的副本,该对象最初是你主流程的APScheduler的精确副本。这导致每个“第n个”工作人员(进程)总共执行“ n”次作业。

解决此问题的方法是使用以下选项来运行gunicorn:

env/bin/gunicorn module_containing_app:app -b 0.0.0.0:8080 --workers 3 --preload

该–preload标志告诉Gunicorn“ 在派生工作进程之前加载应用程序 ”。这样,每个工作人员都“获得了已由Master实例化的应用程序副本,而不是实例化了应用程序本身”。这意味着以下代码在主进程中仅执行一次:

rerun_monitor = Scheduler()rerun_monitor.start()rerun_monitor.add_interval_job(job_to_be_run, seconds=JOB_INTERVAL)

此外,我们需要将Jobstore设置为:memory:以外的其他值。这样,尽管每个工作程序都是自己的独立进程,无法与其他7个进程进行通信,但通过使用本地数据库(而不是内存),我们可以保证一个作业库上的CRUD操作的“真点”。

from apscheduler.schedulers.background import BackgroundSchedulerfrom apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStorererun_monitor = Scheduler(    jobstores={'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')})rerun_monitor.start()rerun_monitor.add_interval_job(job_to_be_run, seconds=JOB_INTERVAL)

最后,由于要执行BackgroundScheduler,我们要使用它start()。当我们调用start()BackgroundScheduler时,将在后台启动一个新线程,该线程负责调度/执行作业。这很重要,因为请记住在步骤(1)中,由于我们的–preload标志,我们start()在Master Gunicorn过程中仅执行一次该功能。根据定义,分叉的进程不会继承其父级的线程,因此每个工作进程都不会运行BackgroundScheduler线程。

from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStorererun_monitor = BackgroundScheduler(    jobstores={'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')})rerun_monitor.start()rerun_monitor.add_interval_job(job_to_be_run, seconds=JOB_INTERVAL)

所有这些的结果是,每个Gunicorn工人都有一个APScheduler,该APScheduler被欺骗为“ STARTED”状态,但实际上并没有运行,因为它会丢弃其父线程!每个实例还能够更新作业存储数据库,只是不执行任何作业!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386348.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号