在Celery任务中连接并保存Redis数据

2 投票
1 回答
2277 浏览
提问于 2025-04-16 07:07

我有一个对象,它的作用是把数据保存到Redis这个数据库里。为了尽量减少阻塞,我决定使用Celery来处理这个任务。当我在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

这是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版本上都复现了这个问题。

1 个回答

0

问题是因为celeryconfig.py这个配置文件设置错了。CELERY_IMPORTS里需要包含任务模块。这个问题已经解决了。

撰写回答