バックグラウンドでジョブを実行する小さなアプリに 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 スタイルのタスクは 1 日に 1 回だけ実行され、もう 1 つのタスクは控えめに実行されます
(1 日あたり平均 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 つのタスクしか処理できません。これは私の場合には最適ですが、複数のタスクが互いに重なっているようです。
同時実行レベルを 1 に設定し、プール制限を [なし] に設定して解決しようとしましたが、それでも同じエラーが発生します。
ここでセロリに何か欠けていますか?何か間違ったことをしていますか?私が達成しようとしていることに対するより良いアプローチはありますか?