Использование 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, чтобы попытаться помочь, но я все равно получаю ту же ошибку.
Я пропустил что-то здесь с сельдереем? Что-то не так? Есть ли лучший подход к тому, что я пытаюсь выполнить?