Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django芹菜任务队列_Python_Django_Redis_Celery_Django Celery - Fatal编程技术网

Python Django芹菜任务队列

Python Django芹菜任务队列,python,django,redis,celery,django-celery,Python,Django,Redis,Celery,Django Celery,我用django制作了一个应用程序,它使用redis和芹菜来完成一些异步任务。 我正在使用芹菜任务来执行一些存储过程。此SP需要5分钟到30分钟才能完全执行(取决于记录的数量)。 一切都很好。 但是我需要能够多次执行这些任务。但现在,当我运行任务,另一个用户也运行该任务时,这两个任务同时执行。 我需要将任务输入队列,并仅在第一个任务完成时执行。 My settings.py: BROKER_URL = 'redis://localhost:6379/0' CELERY_IMPORTS = ("p

我用django制作了一个应用程序,它使用redis和芹菜来完成一些异步任务。 我正在使用芹菜任务来执行一些存储过程。此SP需要5分钟到30分钟才能完全执行(取决于记录的数量)。 一切都很好。 但是我需要能够多次执行这些任务。但现在,当我运行任务,另一个用户也运行该任务时,这两个任务同时执行。 我需要将任务输入队列,并仅在第一个任务完成时执行。 My 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'
tasks.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);
如何创建或设置TAK的队列列表,并且只有在前一个TAK完成时才执行每个任务


提前感谢

您可以限制工作人员的任务,因为我假设您每次只需要一名工作人员,所以在呼叫DJ芹菜时只需启动一名工作人员

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

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


我只有一个疑问。我可以在限制工人的同时执行不同的任务。仅对于任务“conci”,我需要一个队列,对于另一个任务,无需多次调用该任务
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")