防止Redis / Celery计划的任务被多次处理-Heroku上的Django

时间:2019-10-29 04:43:01

标签: django heroku redis celery scheduled-tasks

我正在寻找一些建议。我使用Celery / Redis Scheduled任务每隔10秒通过API请求检查一次更改。如果发生更改,将创建一个带有请求反馈的数据库对象,并在进行一些计算时将一个名为is_call的布尔值设置为True,以防止重复。

这在Heroku上在本地和一段时间内都运行良好,但是由于进行了更新(任务代码中的任何内容均未更改),该工作人员似乎很忙,最多使用7个ForkPoolWorkers。

例如,ForkPoolWorker-1将与ForkPoolWorker-7一起执行相同的任务,后者将忽略is_called = True布尔值,并为我创建了1个数据库对象重复计算。

一次只为1个ForkPoolWorker服务的最佳方法是什么?我阅读了文档和Google的研究报告,但尚不完全清楚该做什么以及如何做。

我在Heroku上使用Django构建。

celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "stockpilot.settings")

app = Celery('proj')

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

app.conf.beat_schedule = {
    'every-ten-seconds': {
        'task': 'get_api_task',
        'schedule': 10.0
    },
}

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

0 个答案:

没有答案