簡體   English   中英

為Django項目中的可重用應用程序創建基於類的Celery任務

[英]Create class based Celery task for reusable app in Django project

對於Django項目,創建基於函數的任務非常干凈。 只需在Django應用中創建task.py並開始編寫此示例,就可以從http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html的官方celery文檔中獲取此示例

from __future__ import absolute_import, unicode_literals
from celery import shared_task

@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y

但是有時基於功能的任務緊密結合在一起,並且不太可重用。 所以我想創建基於類的芹菜任務,該任務已在官方網站上進行了記錄。 在遵循https://github.com/celery/celery/issues/3874之后,我可以創建示例任務,但是我不確定它是否是創建基於類的任務的正確方法。

from __future__ import absolute_import, unicode_literals
from celery import shared_task, Task
import time
from celery import current_app


@shared_task
def add(x, y):
    time.sleep(5)
    return x + y


@shared_task
def mul(x, y):
    return x * y

# Sample class based task for testing
class AnotherTask(current_app.Task):
    name = 'tasks.another_task'
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def run(self):
        time.sleep(5)
        return self.x + self.y
# We need to manually register this class based task    
current_app.tasks.register(AnotherTask(3, 4))

我可以調用此任務,但每個調用結果值都相同

(workflow) alok@alok-MacBookAir:~/exp/expdjango/mysite$ ./manage.py shell
Python 3.6.3 (default, Oct  3 2017, 21:45:48) 
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from polls.tasks import *

In [2]: r = AnotherTask(3,4).delay()

In [3]: r.get()
Out[3]: 7

In [4]: r = AnotherTask(5,6).delay()

In [5]: r.get()
Out[5]: 7

這是創建和調用基於類的任務的正確方法嗎?

實際上,每個運行時僅實例化一次基於類的任務。 如果要對任務進行參數化,請向run方法添加參數:

class AnotherTask(current_app.Task):
    name = 'tasks.another_task'

    def run(self, x, y):
        time.sleep(5)
        return x + y

然后您可以這樣稱呼它:

r = AnotherTask().delay(3, 4)
# Or
r = AnotherTask().apply_async(args=[3, 4])

基於類的任務的文檔中,尤其是在實例化部分中 ,也對此進行了描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM