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 回答