Celery动态任务/隐藏Celery实现后面的界面 [英] Celery dynamic tasks / hiding Celery implementation behind an interface

查看:181
本文介绍了Celery动态任务/隐藏Celery实现后面的界面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图弄清楚如何使用Celery实现我的异步作业,而不是将它们绑定到Celery实现。

I am trying to figure out how to implement my asynchronous jobs with Celery, without tying them to the Celery implementation.

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

If I have an interface that accepts objects to schedule, such as callables (Or an object that wraps a callable):

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

我可以用treading模块实现它:

And I might implement it with the treading module:

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

但似乎芹菜无法做到这一点,对吗?

But it seems this couldn't be done with celery, am I right?

推荐答案

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

Perhaps one, albeit quite ugly, solution might be to define one celery task which dynamically loads the task object that is passed as an argument:

@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)

这篇关于Celery动态任务/隐藏Celery实现后面的界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆