2012-09-29 137 views
3

可能重複:
How can I find all subclasses of a given class in Python?如何獲得芹菜所有任務和週期性任務

在我的Django項目,我有芹菜的TaskPeriodicTask的一些子類:

class CustomTask(Task): 
    # stuff 

class CustomPeriodicTask(PeriodicTask): 
    # stuff 

我需要所有任務類來添加一些自定義日誌配置通貨膨脹。所以我想我能給我們__subclasses__,但這不起作用:

>>> Task.__subclasses__() 
[<unbound PeriodicTask>, <class handle_register of <Celery default:0xa1cc3cc>>] 

是它在某種程度上可能得到以動態的方式我所有的TaskPeriodicTask子?

+1

我認爲,這不是,因爲其他的問題是圍繞着'__subclass__'屬性的有效使用,有什麼不能在這裏工作,你可以看到在這個問題。 – Martin

回答

7

芹菜維護所有任務的註冊表。這是當它接收任務消息的工作如何按名稱查詢一個任務:

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()] 

任務註冊表中只填入含有任務模塊都是進口的。 如果您還沒有導入的所有模塊,可以做到像芹菜工人呢,和 進口所有配置的任務模塊來源:

current_app.loader.import_default_modules() 

注:import_default_modules不存在芹菜2.5之前,那時你不得不到 做:

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

NOTE2:你確定你要編輯的所有任務類這樣嗎?芹菜配有多種方式來配置任務類 ,例如:

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

將設置「日誌級別」和「記錄儀」的所有任務屬性。 或者您可以使用一個公共基類:

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

我想爲每個任務設置單個記錄器,但使用相同的設置,因此全局記錄器將不適合此處。另一方面,我不想爲每個任務配置它,所以我想到了一個程序化的方法。 – Martin

+0

您可以使用基類或註釋爲每個任務創建一個單一的記錄器:class anno(object):def annotate(self,task):return {'logger':logging.getLogger('tasks。%s'%任務名稱); CELERY_ANNOTATIONS = [Anno()]' – asksol