Celery: предотвратить работу с одноименной функцией без промедления

Я использую Redis и Celery вместе для проекта django.

[Предварительное условие]

django==1.5.4
Redis==2.2.4
Celery==3.0.23
django-redis==3.7.1
django-celery==3.0.23

[Структура каталогов]

Project/
     apps/
         app_1/
             views.py
                 def get_something():
         utils/
             redis.py
                 def do_stuff(): // do something related with Redis
             tasks.py
                 @task()
                 def do_stuff(): // execute do_stuff() at redis.py

[Проблема]

В views.py

from utils.redis import do_stuff
from utils.tasks import do_stuff


def get_something():

    do_stuff.delay()  => Execute task by celery (Normal)

    do_stuff()        => Executed do_stuff from tasks.py, not from redis.py
                         Making a recursion error (Unusual)
                         Expected to execute do_stuff from redis.py

Как я могу обработать Celery для выполнения только "методом задержки", когда имя функции перекрывается.

Заранее спасибо.


person Chemical Programmer    schedule 08.09.2014    source источник


Ответы (1)


По понятным причинам у вас не может быть двух одинаковых имен, указывающих на разные вещи в любом коде Python. Вы можете легче различать их, импортируя модуль, а не функцию:

from utils import redis
from utils import tasks


def get_something():
    redis.do_stuff.delay()
    tasks.do_stuff()

Но также обратите внимание, что вы можете вызывать задачи Celery напрямую, без использования delay(), что приводит к их немедленному выполнению в процессе, а не через Celery.

person Daniel Roseman    schedule 08.09.2014
comment
Спасибо за быстрое, простое и краткое решение! - person Chemical Programmer; 08.09.2014