2012-03-30 1 views
2

Использование Django для небольшого приложения, выполняющего задания в фоновом режиме (в основном, cron-стиль, но также и инициированный пользователем).
        отречение: это моя первая встреча с celeryd, установка до сих пор из документации и примеровTransactionManagementError с Django Celeryd/django-celery с sqlite backend

Я использую Django 1.3, celeryd 2,5, Джанго-сельдерей 2.5.1, и sqlite3.
Я все еще на стадии тестирования, поэтому я не говорю о реальной задаче, а просто распечатываю сообщения.

У меня есть задача хрон стиль:

@periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*")) 
def test(): 
    print "firing test task"

И еще одна задача, которая будет инициироваться пользователем:

@task(name="myapp.tasks.user_task") 
def user_task(country): 
    print "performing task for: "+country

хрон задача стиль будет работать только один раз в день, а другая выполняются экономно
        (от 0 до 30'ish раз в день в среднем)

Я использую SQLite в качестве моего бэкэнда и мои настройки сельдерея являются:

# Celery 
INSTALLED_APPS += ("djcelery",) 

import djcelery 
djcelery.setup_loader() 

BROKER_URL = "django://" 
BROKER_POOL_LIMIT = None 
CELERYD_CONCURRENCY = 1

Проблема Я бегу в, что не должно произойти, но потому, что он может, как если пользователь инициировал задача user_task называется несколько раз в быстрой последовательности сельдерея выключается следующим:

Unrecoverable error: TransactionManagementError('Transaction managed block ended with pending COMMIT/ROLLBACK',)
далее вниз по стеку
TransactionManagementError("Transaction managed block ended with " TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

Согласно celerd docs, используя django-celery w/sqlite, я могу обрабатывать только одну задачу за раз, что идеально подходит для моего случая, но похоже, что несколько задач наступают друг на друга.

Я установил уровень параллелизма в 1 и ограничил лимит None, чтобы попытаться помочь, но я все равно получаю ту же ошибку.

Я пропустил что-то здесь с сельдереем? Что-то не так? Есть ли лучший подход к тому, что я пытаюсь выполнить?

ответ

0

Вы можете попробовать использовать rabbitmq в качестве брокера вместо sqlite, что, скорее всего, обойдет проблему, которую вы видите. Инструкции для этого здесь, оно должно быть довольно прямо вперед:

http://ask.github.com/celery/getting-started/broker-installation.html#installing-rabbitmq

Celeryd и RabbitMQ очень надежное сочетание, дать ей идти.

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