Django芹菜任务queu

2024-04-18 22:41:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我用django制作了一个应用程序,使用redis和celery执行一些异步任务。 我使用celery任务执行一些存储过程。完全执行此SP需要5到30分钟(取决于记录的数量)。 一切都很好。 但我需要能够执行几次任务。但是现在当我运行task和另一个用户也运行这个任务时,这两个任务是同时执行的。 我需要任务进入队列,只有在第一个任务完成时才执行。 我的设置.py公司名称:

BROKER_URL = 'redis://localhost:6379/0'
CELERY_IMPORTS = ("pc.tasks", )
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND='djcelery.backends.cache:CacheBackend'

在任务.py在

^{pr2}$

我这样称呼我眼中的任务:

conci.delay(prov,DateV);

如何创建或设置tak的队列列表,并且只有在前一个tak完成时才执行每个任务

提前谢谢


Tags: djangopyredisjson应用程序数量队列过程
2条回答

你可以限制工人的任务,因为我假设你一次只需要一个工人,所以打电话给djcelery时只需启动一个工人。在

python manage.py celery worker -B  concurrency=1

例如,您可以使用lock(来自我的一个项目):

def send_queued_emails(*args, **kwargs):
  from mailer.models import Message
  my_lock = redis.Redis().lock("send_mail")

  try:
    have_lock = my_lock.acquire(blocking=False)
    if have_lock:
        logging.info("send_mail lock ACQUIRED")
        from celery import group

        if Message.objects.non_deferred().all().count() > 0:
            t = EmailSenderTask()
            g = (group(t.s(message=msg) for msg in Message.objects.non_deferred().all()[:200]) | release_redis_lock.s(lock_name="send_mail"))
            g()
        else:
            logging.info("send_mail lock RELEASED")
            my_lock.release()
    else:
        logging.info("send_mail lock NOT ACQUIRED")

  except redis.ResponseError as e:
        logging.error("Redis throw exception : {}".format(e))
  except:
    my_lock.release()
    logging.error("send_mail lock RELEASED because of exception")

相关问题 更多 >