【问题标题】:How to make any method from view/model as celery task如何将视图/模型中的任何方法作为芹菜任务
【发布时间】:2017-01-22 05:41:13
【问题描述】:

我在models.pyclass Analytics 下有一些分析方法(例如:Analytics.record_read_analytics())。我们正在调用这些方法来记录分析,这些方法不需要同步。目前它正在影响每个请求的呈现,因此决定将这些方法添加到 celery 队列中。我们已经在一些任务中使用 celery,因此我们有 tasks.pycelery.py 文件。

以下是models.py文件的部分:

class Analytics():
    ...
    ...

    @staticmethod
    def method_a():
        ...
        ...


    def method_b():
        ...
        ...

    @staticmethod
    def record_read_analytics():
        ...
        ...

我不想在tasks.py 中再次编写相同的模型级别的类方法,并且想将一些视图方法和模型级别的类方法作为 celery 任务。

下面是celery.py文件:

from __future__ import absolute_import
from celery import Celery

app = Celery('gnowsys_ndf',
             include=['gnowsys_ndf.tasks'])

app.config_from_object('gnowsys_ndf.celeryconfig')

if __name__ == '__main__':
    app.start()

我是 celery 的新手,正在寻求帮助。提前谢谢你。

【问题讨论】:

标签: python django celery django-celery


【解决方案1】:

您可以使用methods 创建任务。这样做的坏处是对象本身被传递(因为对象的状态必须与调用者的状态相同)才能被调用,所以你失去了一些灵活性。所以你的对象每次都必须腌制,这就是我反对这个解决方案的原因。 当然这只涉及类方法,静态方法没有这个问题。

我喜欢的另一个解决方案是创建单独的 tasks.py 或基于类的任务并从其中调用方法。这样,您就可以完全控制您的工作人员中的 Analytics 对象。

【讨论】:

    【解决方案2】:

    你可以像这样实现它:

    analytics = Analytics()   # Object of Analytics class
    Analytics.record_read_analytics.delay()
    

    另外,您需要使用 record_read_analytics 函数添加 @task 装饰器

    【讨论】:

    • 我试过了,但任务不会进入芹菜队列。实际上任务没有得到注册。
    • 检查您的消息代理服务是否正在运行
    • 上面的代码是抛出了一些错误还是没有任何操作就退出了?
    • 还要检查您是否包含了您的models.py,即include=['gnowsys_ndf.tasks', 'models.py']
    • 是的。我同意khajvah。而且你还需要重启 celery 服务才能让这些 changer 反映到 celery 进程中
    猜你喜欢
    • 2013-11-09
    • 2016-05-18
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2011-12-02
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多