将 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,以尝试提供帮助,但我仍然遇到相同的错误。
我在这里缺少芹菜的东西吗?做错了什么?有没有更好的方法来完成我想要完成的事情?