【问题标题】:subclassing celery Task继承芹菜任务
【发布时间】:2012-12-01 04:02:06
【问题描述】:

我正在编写很多非常相似的任务,并且想知道如何更好地继承 Task 以减少样板。由于一个任务只被实例化一次,我不能像下面显示的那样把东西放在__init__,但它应该能说明这一点。

我想要完成的事情:

class EmailTaskOne(Task):
    def run(self, object_id):
        email_data = EmailData.objects.get(pk=object_id)
        data = self.do_common_stuff(email_data)
        self.do_unique_stuff(data)

class EmailTaskTwo(Task):
    def run(self, object_id):
        email_data = EmailData.objects.get(pk=object_id)
        data = self.do_common_stuff(email_data)
        self.do_unique_stuff2(data)

# lots more tasks like this

我想要的是:

class BaseEmailTask(Task):
     abstract = True
     #...Insert Magic Here...

class EmailTaskOne(BaseEmailTask):
     def run(self, object_id):
         self.do_unique_stuff(self.data)

所以,既然__init__ 已经出来了,我在哪里设置抽象类中的类。如果我想要做的只是排除一些东西,我可以很容易地定义一堆函数,但是一些(很多)样板文件取决于 object_id。

【问题讨论】:

  • 虽然解决方案适用 - 提出的问题不同。因此,我不认为它是重复的。如果我试图通过使用 mixins 和 sublcassing 来增加我的任务的 DRYness - 我不会寻找“自定义装饰器”,而是“子类”或“mixin”或类似的东西。

标签: python django celery django-celery


【解决方案1】:

我和 MauroRocco 的回答对您有帮助吗?

celery task and customize decorator

我成功地将参数传递给扩展任务

【讨论】:

  • 虽然我不喜欢接受链接回复,但他是一个很好的答案。简而言之 - 覆盖 __call__ 方法而不是 __init__
  • 这是我自己的答案的链接......它也适合这里
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2014-04-16
  • 2018-07-04
  • 2012-08-30
  • 2011-11-20
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多