Skip to main content
 首页 » 编程设计

python之Django celery 多个具有特定并发性的 worker

2024年08月26日27lonelyxmas

我必须从数据库 (oracle) 调用一些存储过程。我使用 celery 和 redis 以异步方式调用此 SP。

任务.py

@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) 
    return None 

我需要为每个任务指定不同的并发。对于任务 CONCI,我需要并发数为 1,对于任务 CARGA_FTP,并发数为 3 或更多

celery multi start -A provcon conc carga -c:conc 1 -c:carga 3 

文件settings.py中我的celery设置

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' 
CELERY_ROUTES = {"tasks.conci": {"queue": "conc"}, "tasks.carga_ftp": {"queue": "carga"}} 

但是 worker “CONC”同时承担了超过1个任务, worker “CARGA”也同时承担了超过3个任务

当我看到过程

ps aux | grep 'celery' 

我看到 worker “CONC”有两个进程, worker “CARGA”有四个进程。

不知道是我漏掉了什么,还是我执行celery的突击队有误。 但是对于任务“CONCI”我一次只需要一个任务

任何建议

提前致谢

请您参考如下方法:

当你启动一个 celery worker 时它就会启动

  1. 消费者进程和
  2. 一个工作池

所以,如果你启动一个并发为 1 的 worker,它将有 2 个进程。对于并发数为 3 的 worker,它有 4 个进程。

Celery 异步处理任务。它将立即处理给定的任务,但一次执行 1 个。