2013-04-04 3 views
12

Nel mio sito Web gli utenti possono AGGIORNARE il loro profilo (manuale) ogni volta che lo desidera, o automatico una volta al giorno.sedano - Attività che devono essere eseguite con priorità

Questa attività viene distribuita con il sedano ora.

ma ho un "problema":

Ogni giorno, in aggiornamento automatico, un lavoro mettere tutti gli utenti (+ 6K utenti) in coda:

from celery import group 
from tasks import * 
import datetime 
from lastActivityDate.models import UserActivity 

today = datetime.datetime.today() 
one_day = datetime.timedelta(days=5) 
today -= one_day 

print datetime.datetime.today() 

user_list = UserActivity.objects.filter(last_activity_date__gte=today) 
g = group(update_user_profile.s(i.user.auth.username) for i in user_list) 

print datetime.datetime.today() 
print g(user_list.count()).get() 

Se qualcuno cerca di fare il aggiornamento manuale, entreranno in coda e dureranno per sempre per essere eseguiti.

C'è un modo per impostare questa attività manuale per l'esecuzione in modo più semplice? Oppure fai un dedicato per ogni coda separata: manuale e automatico?

+0

è possibile limitare il numero di attività eseguite, ad esempio in ore. Poi un altro compito ... Leggi la loro documentazione ... – catherine

risposta

25

Celery non supporta la priorità dell'attività. (V3.0)

http://docs.celeryproject.org/en/master/faq.html#does-celery-support-task-priorities

Si può risolvere il problema di routing compiti.

http://docs.celeryproject.org/en/latest/userguide/routing.html

Preparare predefinito e coda priority_high.

CELERY_DEFAULT_QUEUE = 'default' 
CELERY_QUEUES = (
    Queue('default'), 
    Queue('priority_high'), 
) 

Eseguire due daemon.

[email protected]:/$ celery worker -Q priority_high 
[email protected]:/$ celery worker -Q default,priority_high 

E itinerario compito.

your_task.apply_async(args=['...'], queue='priority_high') 
+2

Per chi arriva a questa risposta tardi (come me); è fondamentale notare che i due operatori di sedano sono in esecuzione su host diversi, ovvero due server stanno consumando dalla coda priority_high e un server sta consumando l'impostazione predefinita – mafrosis

+0

@Satoshi Yoshinaga posso anche ottenere la concorrenza specifica della coda specificando "-c N" param nel demone che esegue i comandi? Ho bisogno di una delle mie code per avere solo alcuni lavoratori e un altro molto altro (pesanti attività in coda). –

+1

Ora puoi anche utilizzare [priorità messaggi] (http://docs.celeryproject.org/en/latest/whatsnew-3.0.html#redis-priority-support) – Chemary