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 スタイルのタスクは 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 に設定し、プール制限を [なし] に設定して解決しようとしましたが、それでも同じエラーが発生します。

ここでセロリに何か欠けていますか?何か間違ったことをしていますか?私が達成しようとしていることに対するより良いアプローチはありますか?

4

1 に答える 1

0

sqlite の代わりに rabbitmq をブローカーとして使用してみると、発生しているタイプの問題を回避できる可能性があります。そのための手順はここにあります。かなり簡単です。

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

Celeryd と rabbitmq は非常に信頼できる組み合わせです。試してみてください。

于 2012-08-17T22:21:18.463 に答える