2

データを Redis に保存するオブジェクトがあります。ブロックの必要性をできるだけ少なくする必要があるため、Celery を使用してタスクをオフロードすることにしました。セロリの外でオブジェクトを .save() しようとすると、Redis に接続され、データが正常に保存されます。ただし、Celery タスクからまったく同じことを実行しようとすると、実行されているように見えますが、Redis への接続、例外、エラー出力はなく、Redis サーバーには何も保存されません。以下の小さなコードで問題を再現しました。test.py:

from celery.decorators import task
import redis

class A(object):
    def __init__(self):
        print "init"

    def save(self):
        self.r = self.connect()
        self.r.set('foo', 'bar')
        print "saved"

    def connect(self):
        return redis.Redis(host="localhost", port=6379)

a = A()

@task
def something(a):
    a.save()

Python コンソール出力は次のとおりです。

>>> from test import *
init
>>> a
<test.A object at 0x1010e3c10>
>>> result = something.delay(a)
>>> result.ready()
True
>>> result.successful()
True

そして、ここにセロリの出力があります:

[2010-11-15 12:05:33,672: INFO/MainProcess] Got task from broker: test.something[d1d71ee5-7206-4fa7-844c-04445fd8bead]
[2010-11-15 12:05:33,688: WARNING/PoolWorker-2] saved
[2010-11-15 12:05:33,694: INFO/MainProcess] Task test.something[d1d71ee5-7206-4fa7-844c-04445fd8bead] succeeded in 0.00637984275818s: None

どんな助けでも素晴らしいでしょう!複数のpythonバージョンを使用して、複数のコンピューターで問題を再現しました。

4

1 に答える 1

0

この問題は、celeryconfig.py の設定ミスが原因でした。タスク モジュールを含めるには CELERY_IMPORTS が必要でした。これは解決されました。

于 2010-11-15T20:40:38.430 に答える