Ошибка транзакции - PullRequest
       24

Ошибка транзакции

2 голосов
/ 30 марта 2012

Использование Django для небольшого приложения, которое выполняет задания в фоновом режиме (в основном в стиле cron, но также и по инициативе пользователя).
отказ от ответственности: это мое первое знакомство с celeryd, настройка пока что из документации и примеров

Я использую Django 1.3, celeryd 2.5, django-celery 2.5.1 и sqlite3.
Я все еще на стадии тестирования, поэтому я не вызываю реальную задачу, а просто распечатываю сообщения.

У меня есть задание в стиле cron:

@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

Задача в стиле cron будет выполняться только один раз в день, в то время как другая будет выполняться редко
(в среднем от 0 до 30 раз в день)

Я использую 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, чтобы попытаться помочь, но я все еще получаю ту же ошибку.

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

1 Ответ

0 голосов
/ 18 августа 2012

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

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

Celeryd и rabbitmq - очень надежная комбинация, попробуйте.

...