Celery:收到<asyncresult:[hash] =“”>

时间:2016-06-15 22:08:53

标签: python redis rabbitmq celery

我在stackOverflow上看到的所有类似问题:

错误说明了未注册的任务的名称。我有一个不同的问题。该任务的名称未显示,而是Received unregistered task of type <AsyncResult: e8018fcb-cd15-4dca-ae6d-6eb906055f13>,结果为KeyError: <AsyncResult: e8018fcb-cd15-4dca-ae6d-6eb906055f13>

这是我的追溯:

KeyError: <AsyncResult: 4aca05f8-14c6-4a25-988a-ff605a27871d>
[2016-06-15 14:11:46,016: ERROR/MainProcess] Received unregistered task of type <AsyncResult: e8018fcb-cd15-4dca-ae6d-6eb906055f13>.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?

The full contents of the message body was:
{'utc': True, 'chord': None, 'args': [], 'retries': 0, 'expires': None, 'task': <AsyncResult: e8018fcb-cd15-4dca-ae6d-6eb906055f13>, 'callbacks': None, 'errbacks': None, 'timelimit': (None, None), 'taskset': 'a6e8d1c0-c75b-471e-b21f-af8492592aeb', 'kwargs': {}, 'eta': None, 'id': '0dffed5f-3090-417c-a9ec-c99e11bc9579'} (568b)
Traceback (most recent call last):
File "/Users/me/Developer/virtualenvironments/project_name/lib/python2.7/site-packages/celery/worker/consumer.py", line 456, in on_task_received
strategies[name](message, body,
KeyError: <AsyncResult: e8018fcb-cd15-4dca-ae6d-6eb906055f13>

我的芹菜应用程序包含我只有3个任务的文件:

应用程序/ celery_app.py:

celery_app = Celery('app',
         broker='amqp://ip',  # RabbitMQ
         backend='redis://ip', #Redis
         include=['app.tasks.assets'])

celery_app.conf.update(
CELERY_DEFAULT_QUEUE = 'local_testing',
CELERY_TASK_RESULT_EXPIRES=86400,  # 24 hours
CELERY_ROUTES={
    'app.tasks.assets.list_assets': {'queue': 'gatherAPI'},
    'app.tasks.assets.massage_assets': {'queue':'computation'},
    'app.tasks.assets.save_assets': {'queue':'database_writes'},
}

应用程序/任务/ assets.py:

from __future__ import absolute_import
from celery import current_app

@current_app.task(name='app.tasks.assets.list_assets')
def list_assets(*args, **kwargs):
    print "list assets"

@current_app.task(name='app.tasks.assets.massage_assets')
def massage_assets(assets):
    print "massaging assets"

@current_app.task(name='app.tasks.assets.save_assets', ignore_result=True)
def save_assets(assets):
    print "saving assets..."

这些错误只发生在队列中的 &#34;芹菜&#34; (我没有使用)和&#34; local_testing&#34;。

所有这些任务的相应队列打印出来并按预期工作,但不知何故,这些队列名为&#34; celery&#34;和&#34; local_testing&#34;正在填补(相同的队列大小)并且一遍又一遍地吐出这个追溯。

这是我如何调用任务......

应用程序/进程/ processes.py:

from celery import group
class Process(object):
    def run_process(self, resource_generator, chain_signature):
        tasks = []
        for resources in resource_generator:
            tasks.append(chain_signature(resources))
        group(tasks)()

应用程序/进程/ assets.py:

from __future__ import absolute_import

from app.processes.processes import Process
from app.indexes.asset import AssetIndex
from app.tasks.assets import *

class AssetProcess(Process):
    def run(self):
        Process.run_process(self,
                            resource_generator=AssetIndex.asset_generator(),
                            chain_signature=(
                                list_assets.s() | 
                                massage_assets.s() | 
                                save_assets.s()))

同样,默认队列设置为&#34; local_testing&#34;,所以我不确定如何将任何东西传送到&#34; celery&#34;队列。我得到的追溯也相当无益。

我从app /上面的目录中启动芹菜工作者(使用&#34; celery&#34;队列,或使用local_testing队列(-Q local_testing)),如下所示:

celery -A app.celery_app worker -l info -n worker3.%h

非常感谢任何帮助。

干杯!

1 个答案:

答案 0 :(得分:1)

我已经确定了问题,而且是使用群组。

通过将链签名传递给参数,它会自动异步应用。通过使用组,我将asyncResult对象分组,这没有任何意义。我这样改变了执行:

TagView

无论如何,这实际上做了我想要的。

干杯