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