3

好的,我已经正确安装了所有东西,以便在 django 中获得 celery + redis

我有

INSTALLED_APPS = (
    'djcelery',
    'kombu.transport.django',
)

这些在我的设置中

CELERY_REDIS_HOST = 'localhost'
CELERY_REDIS_PORT = 8889
CELERY_REDIS_DB = 0
CELERY_RESULT_BACKEND = 'redis'

BROKER_URL = "redis://localhost:8889/0"

REDIS_CONNECT_RETRY = True
CELERY_IGNORE_RESULT = True
CELERY_SEND_EVENTS = True
CELERY_TASK_RESULT_EXPIRES = 60
CELERYBEAT_SCHEDULER= 'djcelery.schedulers.DatabaseScheduler'

我让 redis 使用

./redis-server

它每秒输出到终端,所以我也可以运行

./manage.py celeryd -E -B --loglevel=INFO -n w1.d820

没有错误,我什至可以看到我的任务被添加并成功完成

./manage celeryev

所以即使认为它被 celeryev 记录了,这段代码也不起作用:

from celery.task import task
@task
def add(x, y):
    return x + y

res = add.apply_async(args=[1,5])
print res.wait()

它只是挂起而没有返回结果,我可以看到它实际上试图从 redis 获取它,因为如果我这样做了

./redis-cli
MONITOR

我有很多 GET 试图获取不存在的密钥所以我的结论是 django 没有保存到后端我的设置有什么问题?我认为我错过了一些明显的东西,我看不到它,因为我与这个斗争太久了。帮助

顺便说一句,我不能使用标准端口 6379,因为我在共享服务器上。

使用这些更新

celery==2.5.3
django-celery==2.5.5
django-celery-with-redis==2.5
4

4 回答 4

6

你有import djcelery; djcelery.setup_loader()settings.py

您可以通过运行以下命令找出它尝试连接的位置:

 $ python manage.py celeryctl shell

 >>> celery.broker_connection().as_uri()

'setup_loader' 非常重要,因此您必须确保包含它。

(the good news is that celery will support Django out of the box for version 2.7).

于 2012-06-09T12:27:30.387 回答
4

在 ubuntu 10.10 中,当您安装 redis 时,它会在启动时自动启动,并且它与 celery 冲突,因为显然即使您告诉它使用这个或那个端口,如果 celery 可以在 6379 端口连接到 redis,它也会将其用作后端。我没有看到代码,但这是我的结论。所以我关闭了所有在我想要的任何端口上使用我的 redis.conf 运行的 redis 实例,然后我将它们放在我的设置中。

BROKER_URL = 'redis://localhost:8889/0'
REDIS_DB = 0
REDIS_CONNECT_RETRY = True
CELERY_RESULT_BACKEND = 'redis'
CELERY_REDIS_PORT = 8889
BROKER_PORT = 8889
CELERY_RESULT_PORT = 8889
CELERY_TASK_RESULT_EXPIRES = 10
CELERYBEAT_SCHEDULER= 'djcelery.schedulers.DatabaseScheduler'
于 2012-06-09T01:49:46.743 回答
0

你用的是什么版本的芹菜?在开发版本中,看起来他们使用了不同的装饰器;

from celery.task import task

@celery.task()
def add(x, y):
    return x + y
于 2012-06-09T01:01:16.923 回答
0

你是在 8889 端口启动 Redis 服务器吗?

于 2012-06-09T02:01:29.003 回答