2013-02-01 3 views
1

Je suis en train de me connecter aux céleri singal qui sont décrits ici:
http://docs.celeryproject.org/en/latest/userguide/signals.html
Je peux me connecter au signal task_sent pas de problème. Mais quand j'essaye de me connecter à task_success ou à task_postrun, rien ne se passe. Pour mon courtier et mon backend, j'utilise postgres sql.céleri: événements == signaux?

Je suis en train de comprendre pourquoi il ne fonctionne pas

Une chose que je me posais la question de la documentaiton ici:
http://docs.celeryproject.org/en/latest/getting-started/brokers/sqlalchemy.html#broker-sqlalchemy
Il dit:

Limitations: Événements, y compris le moniteur d'administration Django.

Il n'est pas clair si, quand ils disent événement, ils signifient signaux.

Aide s'il vous plaît.

tasks.py

from celery import Celery 
from celery.signals import task_sent, task_success, task_postrun 
import celeryconfig 

celery_config_dict = {** stuff **} 

celery = Celery('tasks',) 
celery.add_defaults(celery_config_dict) 


@celery.task 
def add(x, y): 
    return x + y 



@task_sent.connect 
def task_sent_handler(sender=None, task_id=None, task=None, args=None, kwargs=None, **kwds): 
    print(''' Task Sent! 
    sender: %s 
    task_id: %s 
    task: %s 
    args: %s 
    kargs: %s 
    kwds: %s''' % ( sender, 
         task_id, 
         task, 
         args, 
         kwargs, 
         kwds)) 


@task_success.connect 
def task_success_handler(sender=None, result=None, args=None, kwargs=None, **kwds): 
    print(''' Success! 
    sender:%s 
    result:%s 
    args:%s 
    kwargs:%s 
    kwds:%s''' % (sender, result, args, kwargs, kwds)) 


@task_postrun.connect 
def task_postrun_handler(sender=None, task_id=None, task=None, args=None, kwargs=None, retval=None, state=None, **kwds): 
    print(''' Done! 
    sender: %s 
    task_id: %s 
    task: %s 
    retval: %s 
    state: %s 
    args:%s 
    kwargs:%s 
    kwds:%s''' % (sender, task_id, task, retval, state, args, kwargs, kwds,)) 

dans l'interpréteur python

>>> import tasks 
>>> r = tasks.add.apply_async((3,8), countdown=10) 
    Task Sent! 
    sender: tasks.add 
    task_id: None 
    task: tasks.add 
    args: (3, 8) 
    kargs: {} 
    kwds: {'utc': True, 'chord': None, 'retries': 0, 'signal': <Signal: Signal>, 'expires': None, 'callbacks': None, 'errbacks': None, 'taskset': None, 'eta': '2013-02-01T01:43:35.978889', 'id': '87c8d0f4-ae67-4c3d-9e94-45e99cf6304a'} 
>>> 

Répondre

4

Non, les événements et les signaux ne sont pas les mêmes. Voir http://docs.celeryproject.org/en/latest/userguide/monitoring.html#events

Vous ne penseriez pas quoi que ce soit à imprimer dans cet interpréteur, en tant que signaux sont locaux à traiter en cours, de sorte que les signaux PreRun/postrun sera déclenchée dans le processus que la tâche est en cours d'exécution dans.

+0

ok merci. ça a du sens. Pouvez-vous m'aider à décrire ou à me montrer un exemple d'utilisation de ces signaux? Je ne comprends pas comment je vais câbler ça. –

+0

ahh ça ne fait rien, je vois les événements qui se déclenchent dans la sortie de la console céleri du serveur céleri maintenant (je n'ai pas démarré le céleri comme démon donc je peux voir toutes les sorties) ok je crois comprendre comment ça fonctionne maintenant. Merci! –

Questions connexes