【发布时间】:2022-12-29 22:37:25
【问题描述】:
我有一个内置 APScheduler 的 django 项目。我现在已经进入生产环境,所以在这个过程中将它与 gunicorn 和 nginx 绑定在一起。 Gunicorn 有 3 个工人。问题是 gunicorn 为每个 worker 启动 APScheduler 并运行计划的作业 3 次而不是只运行一次。
我在这里看到过类似的问题,这似乎是一个常见问题。即使是 APScheduler 原始文档也承认了这个问题,但没有说明修复它的方法。
我在其他线程中看到人们建议将 --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