3

ここに私のコードがあります:

私の仕事

from celery.decorators import task

@task()
def add(x, y):
    return x + y

タスクの使用

from core.tasks import add

results = []

for i in range(100):
    results.append(add.delay(i, i))

問題1

数秒後、次のことを実行します。

for result in results:
    print result.result

これを印刷します:

(値はパターンのようには返されません)

None
None
None
None
8
None
None
None
None
18
None
None
None
None
28
None
None
None
None
38
...

2 回目の OS のクリーン インストールとセットアップ:

すべてが期待どおりに機能していますが、ここで何が起こったのかまだわかりません...


Django管理インターフェース内でもタスクがランダムに欠落しています...


何が起こっているか知っている人はいますか?:|

4

1 に答える 1

4

task.delay() は非同期です。ところで、AMQP 全体は、タスクを非同期にすることです。同期動作が必要な場合、セロリを使用するポイントは何ですか?

from celery.decorators import task

@task()
def add(x, y, results):
    results.append(x + y)

------------8<-------------
from core.tasks import add

results = []

for i in range(100):
    add.delay(i, i, results)

印刷する前に (消費者が作業を行っている間) 数秒待ち、結果が順不同になる可能性があることに注意してください。

メソッド task.delay は celery.result.AsyncResult インスタンスを返します。AsyncResult.result を使用する前に、AsyncResult.state == SUCCESS を確認する必要があります。

最終的な印刷ループは次のようになります。

for result in results:
    while not result.state.ready():
        time.sleep(secs)
    if result.state == u'SUCCESS':
        print result.result
    else:
        print "Something Rotten in the State of Denmark..."

これは (ほぼ) 以下と同じです:

for result in results:
    print result.get()

TaskSetsを見てください。結果をリストに保存するよりも優れています。

実際には、人々は結果をデータベースに保存し、クライアントに待機ループを配置します。これにより、完了まで数秒ごとに AJAX を介してサーバーが攻撃されます。

于 2010-12-27T23:05:24.743 に答える