0

実行時に関数を同期的に実行するか非同期的に実行するかを決定できるようにしたいので、次のコードを書きました。

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)

残念ながら、これは機能しません (セロリ ワーカーから「タイプの未登録タスクを受け取りました」というエラーが表示されます)。私が望んでいることを達成することは可能ですか?

4

1 に答える 1

0

is_eager 引数を使用して、必要に応じて .delay に渡すことができます。

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

したがって、次のようにします。

kwargs = {is_eager:False} #runs async

条件に応じて、後で True に設定されます。

kwargs = {is_eager:True} #runs sync

もっと何かをする

name_of_task.delay(your_arg,**kwargs)
于 2012-12-10T17:52:18.863 に答える