【问题标题】:TransactionManagementError with Django Celeryd / django-celery with sqlite backendTransactionManagementError 与 Django Celeryd / django-celery 与 sqlite 后端
【发布时间】:2012-04-14 08:30:41
【问题描述】:

将 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 设置是:

# Celery
INSTALLED_APPS += ("djcelery",)

import djcelery  
djcelery.setup_loader()

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

我遇到的问题不应该发生,但会因为它可以发生,如果用户启动的任务user_task 被快速连续调用几次 celery 会以以下方式关闭:

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,以尝试提供帮助,但我仍然遇到相同的错误。

我在这里缺少芹菜吗?做错了什么?有没有更好的方法来完成我想要完成的工作?

【问题讨论】:

    标签: django sqlite django-celery celeryd


    【解决方案1】:

    您可以尝试使用rabbitmq 作为代理而不是sqlite,这可能会规避您所看到的问题类型。说明在这里,应该很简单:

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

    Celeryd 和 rabbitmq 是很靠谱的组合,试试看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2016-03-04
      • 2017-10-24
      • 2011-06-15
      • 2013-09-08
      相关资源
      最近更新 更多