簡體   English   中英

Django Celery任務隊列

[英]Django Celery tasks queue

我有一個應用程序使用django使用redis和celery來完成一些異步任務。 我正在使用celery任務來執行一些存儲過程。 此SP需要5分鍾到30分鍾才能完全執行(取決於記錄量)。 一切正常。 但是我需要能夠多次執行任務。 但是現在,當我運行任務並且另一個用戶也運行該任務時,這兩個任務會同時執行。 我需要任務進入隊列並僅在第一個任務完成時執行。 我的settings.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'

task.py

from __future__ import absolute_import
from celery.decorators import task
from celery import task, shared_task
from .models import Servicio, Proveedor, Lectura_FTP, Actualizar_Descarga
from .models import Lista_Archivos, Lista_Final, Buscar_Conci

@task
def carga_ftp():
    tabla = Proc_Carga()
    sp = tabla.carga()
    return None

@task
def conci(idprov,pfecha):
    conci = Buscar_Conci()
    spconc = conci.buscarcon(idprov,pfecha)

我以這種方式在我的視圖中調用任務:

conci.delay(prov,DateV);

我如何創建或設置Taks的隊列列表,而Everry任務僅在之前的Taks完成后才執行

提前致謝

您可以限制工作人員的任務,由於您的原因,我認為您一次只需要一名工作人員,因此在致電djcelery時只需啟動一名工作人員即可。

python manage.py celery worker -B --concurrency=1

例如,您可以使用鎖(來自我的一個項目):

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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM