Cómo obtener todas las tareas y tareas periódicas en el apio

Posible duplicado:
¿Cómo puedo encontrar todas las subclases de una clase dada en Python?

En mi proyecto Django, tengo algunas subclases de Task de Celery y Task PeriodicTask :

 class CustomTask(Task): # stuff class CustomPeriodicTask(PeriodicTask): # stuff 

Necesito todas las clases de tareas para agregar alguna configuración de registro personalizada. Así que pensé que podemos __subclasses__ , pero esto no funciona:

 >>> Task.__subclasses__() [, <class handle_register of >] 

¿Es posible obtener de alguna manera dinámica todas mis subclases de Task y Task PeriodicTask ?

Apio mantiene un registro de todas las tareas. Así es como el trabajador puede buscar una tarea por nombre cuando recibe un mensaje de tarea:

 from celery import current_app all_task_names = current_app.tasks.keys() all_tasks = current_app.tasks.values() foo_task = current_app.tasks['tasks.foo'] all_task_classes = [type(task) for task in current_app.tasks.itervalues()] 

El registro de tareas solo se completa cuando se importan los módulos que contienen tareas. Si no ha importado todos los módulos, puede hacerlo como lo hace el trabajador de apio e importar todas las fonts de módulos de tareas configuradas:

 current_app.loader.import_default_modules() 

NOTA: import_default_modules no existe antes de Celery 2.5, en ese entonces tendrías que hacer:

 from celery.loaders import current_loader current_loader().init_worker() 

NOTA2: ¿Está seguro de que desea editar todas las clases de tareas como esta? El apio viene con varias formas de configurar clases de tareas, por ejemplo:

 CELERY_ANNOTATIONS = { '*': { 'loglevel': logging.DEBUG, 'logger': logging.getLogger('foo'), }, } 

establecerá los atributos ‘loglevel’ y ‘logger’ de todas las tareas. Alternativamente, puedes usar una clase base común:

 class MyTask(Task): abstract = True # means this base task won't be registered loglevel = logging.DEBUG logger = logging.getLogger('foo'),