Python 如何将视图/模型中的任何方法作为芹菜任务

Python 如何将视图/模型中的任何方法作为芹菜任务,python,django,celery,django-celery,Python,Django,Celery,Django Celery,我在class analytics下的models.py中有一些分析方法(例如:analytics.record\u read\u analytics())。我们调用这些方法来记录分析,而不需要同步。目前它正在影响每个请求的呈现,所以决定在芹菜队列中添加这些方法。我们已经在为一些任务使用芹菜,因此我们有tasks.py和cellery.py文件 以下是models.py文件的一节: class Analytics(): ... ... @staticmethod

我在
class analytics
下的
models.py
中有一些分析方法(例如:
analytics.record\u read\u analytics()
)。我们调用这些方法来记录分析,而不需要同步。目前它正在影响每个请求的呈现,所以决定在芹菜队列中添加这些方法。我们已经在为一些任务使用芹菜,因此我们有
tasks.py
cellery.py
文件

以下是
models.py
文件的一节:

class Analytics():
    ...
    ...

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


    def method_b():
        ...
        ...

    @staticmethod
    def record_read_analytics():
        ...
        ...
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()
我不想在
tasks.py
中再次编写相同的模型级类方法,而是想将一些视图方法和模型级类方法作为芹菜任务

下面是
芹菜.py
文件:

class Analytics():
    ...
    ...

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


    def method_b():
        ...
        ...

    @staticmethod
    def record_read_analytics():
        ...
        ...
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()

我是新来的
芹菜
,正在寻求帮助。提前感谢您。

您可以通过以下方式实现:

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

此外,您还需要添加
@task
装饰器,该装饰器具有
记录\读取\分析
功能

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


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

将对象参数传递给芹菜函数会产生错误,但我看不到,因此用于发现问题并正确指出。还要感谢@khajvah和Moinuddin提供了一些有用的更正。现在它工作得很好!我试过了,但任务并没有进入芹菜队列。实际上,任务没有得到注册。检查您运行的message broker服务是否是上面的代码引发了一些错误或未执行任何操作就退出了?还要检查您是否包含了
models.py
,即
include=['gnowsys\u ndf.tasks','models.py']
是。我同意卡伊瓦的观点。您还需要重新启动芹菜服务,以使这些更改器反映芹菜进程