2

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

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

4

1 回答 1

0

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

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

Celeryd 和 rabbitmq 是一个非常可靠的组合,试一试。

于 2012-08-17T22:21:18.463 回答