APScheduler 针对 Gunicorn 工作线程的数量运行多次

问题描述 投票:0回答:2

我有一个内置了 APScheduler 的 django 项目。我现在已经进入生产环境,因此在过程中将其与gunicorn和nginx绑定。 Gunicorn 有 3 名工人。问题是,gunicorn 为每个工作进程启动 APScheduler 并运行计划作业 3 次,而不是只运行一次。

我在这里看到过类似的问题,这似乎是一个常见问题。即使 APScheduler 原始文档也承认了这个问题,但没有给出解决方法。

https://apscheduler.readthedocs.io/en/stable/faq.html#how-do-i-share-a-single-job-store-among-one-or-more-worker-processes

我在其他线程中看到人们建议将 --preconfig 放入设置中。但我读到 --preconfig 使用当前代码启动工作程序,并且当代码发生更改时不会重新加载。(请参阅下面链接中的“何时不预加载”)

https://www.joelsleppy.com/blog/gunicorn-application-preloading/

我还看到有人建议为 APScheduler 绑定 TCP 套接字。我没有完全理解它,但基本上它是在每次启动 APScheduler 时尝试绑定一个套接字,然后第二个和第三个工作线程点击该绑定的套接字并抛出套接字错误。有点

try: 
    "bind socket somehow" 
except socketerror:
    print("socket already exists")"
else:
    "run apscheduler module"

配置。有谁知道怎么做或者知道这是否真的有效?

我认为的另一个解决方法是简单地删除 APScheduler 并使用服务器的 cron 功能来完成。我正在使用 Digital Ocean,因此我可以简单地删除 APScheduler 和将运行该模块的 cron 函数。但是,我不想走那条路,因为这会破坏整个项目的“统一性”并使其服务器可靠。还有人有更多想法吗?

日程模块:

from apscheduler.schedulers.background import BackgroundScheduler
from RENDER.views import dailypuzzlefunc

def start():
    scheduler=BackgroundScheduler()
    scheduler.add_job(dailypuzzlefunc,'cron', day="*",max_instances=2,id='dailyscheduler')
    scheduler.start()

在应用程序中:

from django.apps import AppConfig

class DailypuzzleConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "DAILYPUZZLE"

    def ready(self):
        from SCHEDULER import dailypuzzleschedule
        dailypuzzleschedule.start()
django scheduled-tasks gunicorn apscheduler
2个回答
2
投票
web: 
  python manage.py collectstatic --no-input; 
  gunicorn MasjidApp.wsgi --timeout 15 --preload

use --preload. 

这对我来说效果很好。


0
投票

--预加载就像一个魅力。

这是来自他们的官方文档

© www.soinside.com 2019 - 2024. All rights reserved.