Celery动态任务/隐藏Celery实现后面的界面

时间:2012-09-29 14:52:59

标签: python interface celery encapsulation

我试图找出如何使用Celery实现我的异步作业,而不是将它们与Celery实现联系起来。

如果我有一个接受要调度的对象的接口,例如callables(或者包含可调用对象的对象):

ITaskManager(Interface):
    def schedule(task):
        #eventually run task

我可以使用treading模块实现它:

ThreadingTaskManager(object)
    def schedule(task):
        Thread(task).start() # or similar

但似乎芹菜不能做到这一点,对吗?

1 个答案:

答案 0 :(得分:3)

也许一个虽然相当丑陋的解决方案可能是定义一个芹菜任务,它动态加载作为参数传递的任务对象:

@celery.task
def taskrunner(taskname):
    taskModule = __import__(taskname)
    taskModule.run()

CeleryTaskManager(object)
    def schedule(task):
        taskrunner.delay(task.__file__)


from mytask import run

CeleryTaskManager().schedule(run)