19

私はセロリとジャンゴ全般にかなり慣れていないので、知識不足を許してください。テストを実行していくつかの計算を行い、テストが終了するのを待って、正しい答えが得られるようにします。

ここに私が持っているものがあります:

app/tests.py 内

from tasks import *


c = calculate.apply_async(args=[1])

# wait until the task is done
while not calculate.AsyncResult(c.id).status == "SUCCESS":
    print c.state
    pass

app/tasks.py で

from celery import shared_task

@shared_task
def calculate(proj_id):

    #some calculations followed by a save of the object

セロリログでタスクが正常に完了したと表示されていても、状態が保留中から変わることはありません

[2014-06-10 17:55:11,417: INFO/MainProcess] Received task: app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac]
[2014-06-10 17:55:11,505: INFO/MainProcess] Task app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac] succeeded in 0.0864518239978s: None

CELERY_IGNORE_RESULT = False も mainapp/settings.py に入れましたが、これは何もしていないようです。

4

3 に答える 3

6

つまり、設定が間違っています。:) また、セロリが機能するようにブローカーをセットアップする必要があります。

まず第一に、は推奨されてdjceleryいません。celerydjango

次に、すべてのコンテンツを受け入れるように設定しないでください。潜在的なセキュリティ リスクになる可能性があります。pickleシンプルjsonでは不十分な場合にのみ使用してください (たとえば、関数またはオブジェクトを引数としてタスクに渡したり、タスクから戻ったりするとします)。

だから私の推測では、セロリを試しているだけなので、データベース バックエンドを使用しようとしているのですが、これは問題ありませんが、本番環境で使用するには、RabbitMQ を使用することをお勧めします。

いずれにせよ、これらの設定で試してみてください。

BROKER_URL = 'django://'
INSTALLED_APPS = (
    ...
    'kombu.transport.django', 
    ...
)
CELERY_RESULT_BACKEND = 'db+scheme://user:password@host:port/dbname' 
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IGNORE_RESULT = False # this is less important

次に実行しますpython manage.py syncdb

念のために言っておきますが、私はデータベースをブローカーまたは結果のバックエンドとして使用したことがないため、セットアップが不完全であるか、正しくない可能性さえありますが、とにかく試してみてください。

CELERY_RESULT_BACKENDデータベース例の詳細設定

RabbitMQ をブローカー バックエンドとしてセットアップする場合は、これをお勧めします。確実に機能することがわかっています。

ubuntu 実行の場合:

sudo apt-get install rabbitmq-server
sudo rabbitmqctl add_user <username> <password>
sudo rabbitmqctl add_vhost <vhost, use project name for example>
sudo rabbitmqctl set_permissions -p <vhost> <username"> ".*" ".*" ".*"

次に、でセロリを構成しますsettings.py

BROKER_URL = 'amqp://<user>:<password>@localhost:5672/<vhost>'
CELERY_TIMEZONE = TIME_ZONE
CELERY_RESULT_BACKEND = 'amqp'
# thats where celery will store scheduled tasks in case you restart the broker:
CELERYD_STATE_DB = "/full/path/data/celery_worker_state" 
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

それがどうなるか教えてください。

于 2014-06-13T08:47:38.797 に答える