2

我有一个将数据保存到 Redis 的对象。它需要尽可能少地阻塞,所以我决定使用 Celery 来卸载任务。当我尝试 .save() 芹菜之外的对象时,它连接到 Redis 并很好地存储数据。但是,当我尝试从 Celery 任务中执行完全相同的操作时,它看起来像是在运行,但是没有与 Redis 的连接,没有异常,没有错误输出,并且没有任何内容保存到 Redis 服务器。我用下面的一小段代码复制了这个问题。测试.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

这是 celeryd 的输出:

[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 回答