2015-06-04 142 views
0

我通过开发自己的Reddit克隆(在ubuntu 14.04 LTS上)近来学习Python(2.7)/ Django(1.5)。我试图将Celery(3.1)和Redis整合到一起,使用它来定期运行排名算法(作为我的当地设置)。但不幸的是,我无法让这个简单的任务执行一次!你能帮我发现我做错了吗?Redis Broker的芹菜工人无法执行Django任务

这里是我的目录结构

-unconnectedreddit (manage.py is here) 
    -links (tasks.py, models.py, views.py, admin.py) 
    -unconnectedreddit (celery.py, __init.py___, settings.py, urls.py) 
     -static 
     -templates 

Celery.py

from __future__ import absolute_import 
import os 
from celery import Celery 
from django.conf import settings 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'unconnectedreddit.settings') 

app = Celery('unconnectedreddit', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0',include=['unconnectedreddit.links.tasks']) 
app.config_from_object('django.conf:settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=3600, 
) 

if __name__ == '__main__': 
    app.start() 

添置settings.py如下。请注意,我没有跑migrate加入 'djcelery' 到安装的应用程序后:

INSTALLED_APPS = ('djcelery',) 

import djcelery 
djcelery.setup_loader() 

BROKER_URL = 'redis://localhost:6379/0' 

CELERY_IMPORTS = ('links.tasks',) 

CELERY_ALWAYS_EAGER = False 

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' 

CELERY_ACCEPT_CONTENT = ['json'] 
CELERY_TASK_SERIALIZER = 'json' 
CELERY_RESULT_SERIALIZER = 'json' 
CELERY_IGNORE_RESULT=True 

from datetime import timedelta 

CELERYBEAT_SCHEDULE = { 
    'rank_all-every-30-seconds': { 
     'task': 'tasks.rank_all', 
     'schedule': timedelta(seconds=30), 
    }, 
} 

CELERY_TIMEZONE = 'UTC' 

__init__.py

from __future__ import absolute_import 
from .celery import app as celery_app1 

tasks.py

import os 
from unconnectedreddit import celery_app1 
import time 
from links.models import Link 

@celery_app1.task 
def rank_all(): 
    for link in Link.with_votes.all(): 
     link.set_rank() #ranks interesting 'links' submitted by users 

我m在终端上运行这个命令来启动一个worker:celery -A unconnectedreddit worker -l info

输出我得到的是如下:

-------------- [email protected] v3.1.18 (Cipater) 
---- **** ----- 
--- * *** * -- Linux-3.16.0-30-generic-x86_64-with-Ubuntu-14.04-trusty 
-- * - **** --- 
- ** ---------- [config] 
- ** ---------- .> app:   unconnectedreddit:0x7f938b838910 
- ** ---------- .> transport: redis://localhost:6379/0 
- ** ---------- .> results:  redis://localhost:6379/0 
- *** --- * --- .> concurrency: 1 (prefork) 
-- ******* ---- 
--- ***** ----- [queues] 
-------------- .> celery   exchange=celery(direct) key=celery 


[tasks] 
    . links.tasks.rank_all 

[2015-06-04 12:01:17,083: INFO/MainProcess] Connected to redis://localhost:6379/0 
[2015-06-04 12:01:17,098: INFO/MainProcess] mingle: searching for neighbors 
[2015-06-04 12:01:18,107: INFO/MainProcess] mingle: all alone 
/home/has/.virtualenvs/unconnectedreddit/local/lib/python2.7/site-packages/celery/fixups/django.py:265: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments! 
    warnings.warn('Using settings.DEBUG leads to a memory leak, never ' 

[2015-06-04 12:01:18,136: WARNING/MainProcess] /home/has/.virtualenvs/unconnectedreddit/local/lib/python2.7/site-packages/celery/fixups/django.py:265: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments! 
    warnings.warn('Using settings.DEBUG leads to a memory leak, never ' 

[2015-06-04 12:01:18,137: WARNING/MainProcess] [email protected] ready. 

就是这样。我已经着手定期每隔30秒运行一次这个任务(请参阅我的CELERYBEAT_SCHEDULE)。但是我的代码不会导致它执行一次 - 我的reddit克隆上的排名根本不会改变。任何专家都可以指出我在这个设置中缺少的东西吗?

+0

什么时候开始拍芹菜:这得到了通过更改任务装饰以@celery_app1.task(name='tasks.rank_all')和调整我的节拍时间表,包括正确的名字定了吗?像'celery -A unconnectedreddit worker -l info -B'或者来自一个单独的命令,比如'celery -A unconnectedreddit beat'。顺便说一句,我建议更新到Django 1.8,除非你有一个很好的理由坚持1.5。 – qwattash

+0

@qwattash尝试您的建议,我收到错误:'[2015-06-05 02:10:3​​4,890:错误/ MainProcess]收到未注册的任务类型u'tasks.rank_all'.'我不知道为什么可以来 - 我觉得我已经完成了所有事情(如我在上面的模块中所示)。 –

+0

我使用1.5,因为我正在为低资源环境中的人开发Web应用程序(针对Facebook的internet.org)。例如,我们的项目甚至不支持JS。 Django 1.5足以满足我在这里要做的事情(特别是内置的django注释)。 –

回答

0

错误的任务名称

CELERYBEAT_SCHEDULE = { 
    'tasks.rank_all': { 
     'task': 'tasks.rank_all', 
     'schedule': timedelta(seconds=30), 
    }, 
}