2013-09-20 3 views
0

Я пытаюсь написать команду управления, которая запускает одну или несколько задач Сельдерея.Сельдерей: Запустить задачу из команды управления Django

Для этого я определил вспомогательную функцию:

from celery import chord 
from front import models 
from worker.tasks import process_account, notify # The celery tasks 

def register_check(account_ids, user): 
    if not account_ids: 
     return 
    tasks = [process_account.si(user.pk, acc) for acc in account_ids] 
    maintask = chord(tasks)(notify.s()) 
    maintask.track_started = True 
    kwargs = { 
     'task_id': maintask.id, 
     'user': user, 
     'accounts': map(int, account_ids), 
    } 
    user_job = models.UserJob.objects.create(**kwargs) 
    return user_job 

Все работает хорошо при запуске задачи этот путь с точки зрения, но при вызове той же функции из команды пользовательского управления, он не работает:

import sys 
from django.core.management.base import BaseCommand 
from front.utils import register_check 
from front.models import User 

class Command(BaseCommand): 
    help = 'Run recurring checks. Use --daily, --weekly and/or --monthly options.' 

    def handle(self, *args, **options): 
     users = User.objects.filter(condition='value') 
     for user in users: 
      # fetch account_ids 
      user_job = register_check(account_ids=account_ids, user=user) 
     sys.stdout.write('Done, processed {} users.\n'.format(users.count())) 

Вместо этого я получаю следующее отслеживающий:

# (...) 
    File "/home/danilo/.virtualenvs/radar/lib/python2.7/site-packages/amqp/connection.py", line 136, in __init__ 
    self.transport = create_transport(host, connect_timeout, ssl) 
    File "/home/danilo/.virtualenvs/radar/lib/python2.7/site-packages/amqp/transport.py", line 264, in create_transport 
    return TCPTransport(host, connect_timeout) 
    File "/home/danilo/.virtualenvs/radar/lib/python2.7/site-packages/amqp/transport.py", line 99, in __init__ 
    raise socket.error(last_err) 
error: [Errno 111] Connection refused 

Должен ли я каким-то образом инициализировать сельдерей в команде управления? Или есть какой-то параметр, который мне нужно включить, чтобы заставить задачи Сельдерея работать из пользовательской команды управления?

(я не думаю, что это уместно, но мы используем Redis и Postgres в качестве брокера/бэкэндом.)

ответ

2

Вы могли бы проверить, где в вашем приложении вы звоните import djcelery djcelery.setup_loader(), потому что, возможно, не будучи когда вы запускаете команду управления.

Смежные вопросы