在Celery任务中连接并保存Redis数据
我有一个对象,它的作用是把数据保存到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里需要包含任务模块。这个问题已经解决了。