2012-12-10 30 views
0

我想能夠決定我是否應該在運行時synchroniuosly或asynchroniusly執行功能,所以我寫了下面的代碼:決定是否使用芹菜或在運行時不會

class DefaultUseCeleryPolicy(UseCeleryPolicy): 
    def use(self): 
     return anyCeleryWorkerRunning() or FORCE_CELERY 

#-------------------------------------------------------------------------------------- 

class TaskDispatcher(object): 
    def __init__(self, usePolicy): 
     self.usePolicy = usePolicy 

    def dispatch(self, function, *args, **kwargs): 
     pass 

#-------------------------------------------------------------------------------------- 

class CeleryTaskDispatcher(TaskDispatcher): 
    def __init__(self, usePolicy = DefaultUseCeleryPolicy()): 
     super(CeleryTaskDispatcher, self).__init__(usePolicy) 

    def dispatch(self, function, *args, **kwargs): 
     if self.usePolicy.use(): 
      t = task(function) 
      tasks.register(t) 
      t.delay(args, kwargs) 
     else: 
      function(args, kwargs) 

不幸的是,這並不工作(我正在收到「芹菜工人收到未註冊類型錯誤的任務」)。是否有可能實現我想要的?

+0

完全回溯可能會有所幫助。 –

+0

當然:http://pastebin.com/nC1T0MAx – mnowotka

回答

0

您可以使用is_eager參數並傳遞到.delay需要的基礎上:

http://docs.celeryproject.org/en/latest/userguide/tasks.html#context

所以,你會做這樣的事情:

kwargs = {is_eager:False} #runs async 

後來被設置根據標準爲真:

kwargs = {is_eager:True} #runs sync 

do som e更多東西

name_of_task.delay(your_arg,**kwargs) 
+0

我可以改變if .. else ...部分使用is_eager,但我確信代碼仍然會被破壞。真正的問題是如何在函數內部的運行時生成和註冊新任務。我承認我剛剛意識到問題的存在,所以題目中的問題有點誤導...... – mnowotka

+0

爲什麼你需要有時間註冊任務,而不是其他時間? –

+0

可以說我在我的項目中有很多功能。我不知道所有這些,我不想將它們放在一個名爲tasks.py的文件中,因爲它們真的不同。我需要一些能夠接受任何函數並在運行時決定是否同步運行的函數。 – mnowotka