2015-04-16 4 views
1

Я пытаюсь цепь вместе два task_methods с использованием сельдерея, но я получаю следующее сообщение об ошибке:Chaining сельдерей Метода задачи Ошибка

ошибка:

>>> from proj.tasks import A 
>>> a = A() 
>>> s = (a.add.s(1,2) | a.show.s()).delay().get() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/site-packages/celery/result.py", line 175, in get 
    raise meta['result'] 
TypeError: show() takes exactly 2 arguments (1 given) 

Обратите внимание, я не получаю эту ошибку, когда цепочка обычный (автономные функции) задачи сельдерея вместе, только task_methods (функции класса). Я не могу сказать, не передан ли объект self или если результат от первой задачи не передается.

Вот мой макет проекта:

proj/__init__.py 
    celery_app.py 
    tasks.py 

tasks.py:

from __future__ import absolute_import 
from celery import current_app 
from celery.contrib.methods import task_method 
from proj.celery_app import app 

class A: 

    def __init__(self): 
     self.something = 'something' 

    @current_app.task(filter=task_method) 
    def add(self,x, y): 
     return x + y 

    @current_app.task(filter=task_method) 
    def show(self,s): 
     print s 
     return s 

celery_app.py:

from __future__ import absolute_import 
from celery import Celery 

app = Celery('proj', 
     broker='amqp://', 
     backend='amqp://', 
     include=['proj.tasks']) 

app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=3600, 
) 

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

Вот ошибка из сельдерея работника:

[2015-04-15 19:57:52,338: ERROR/MainProcess] Task proj.tasks.show[e1e5bc12-6d36-46cd-beb7-fd92a0a5f5c2] raised unexpected: TypeError('show() takes exactly 2 arguments (1 given)',) 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/site-packages/celery/app/trace.py", line 240, in trace_task 
R = retval = fun(*args, **kwargs) 
    File "/usr/lib/python2.6/site-packages/celery/app/trace.py", line 438, in __protected_call__ 
return self.run(*args, **kwargs) 
TypeError: show() takes exactly 2 arguments (1 given) 

Неужели кто-нибудь успешно цеплял task_methods с сельдереем? Благодаря!

редактировать: Стоит также отметить, что следующий код является успешным:

>>> from proj.tasks import A 
>>> a = A() 
>>> sum = a.add.s(1,2).delay().get() 
>>> show = a.show.s(sum).delay().get() 

Кроме того, я знаю, что это можно было бы утверждать, что эти функции не должны быть в классе, но притворяться, что они это делают. Я использовал простые функции, чтобы помочь проиллюстрировать вопрос.

EDIT

Я нашел обходной путь, хотя лучшее решение по-прежнему желательно:

Во-первых, пересмотреть tasks.py:

... 
def show(s,self): 
    print s 
    return s 
... 

Тогда вы можете позвонить s = (a.add.s(1,1) | a.show.s(a)).delay().get(), установка s до 2.

Интересно, что вызов s = (a.add.s(1,1) | a.show.s(self=a)).delay().get() отходит назад t он следующее сообщение об ошибке:

TypeError: s() got multiple values for keyword argument 'self'

Это не идеальное решение, так как функция шоу не может быть вызван, если в цепочке.

Например, следующие вопросы:

>>> a.show(s='test') 
TypeError: show() got multiple values for keyword argument 's' 

и

>>> a.show(s='test',self=a) 
TypeError: __call__() got multiple values for keyword argument 'self' 
+0

Если бы я должен был догадаться, что испытывает проблемы с 'self' аргумента. Когда цепочка первого аргумента второй задачи - это возврат из первой задачи, поэтому в вашем экземпляре 'self = 3', но s никогда не будет установлен, следовательно, ошибка 1 дает. – user2097159

+0

@ user2097159 Если я делаю следующее: '>>> s = (a.add.s (1,2) | a.show.s (a)). Delay(). Get()', s устанавливается в a, объект instanced A. –

ответ

0

Согласно Ask Solem Хоэлу, создатель сельдерея, методы задачи не были "неудачный эксперимент", и больше не будет поддерживаться. Думаю, это отвечает на мой вопрос - в настоящее время это невозможно сделать.

Source

 Смежные вопросы

  • Нет связанных вопросов^_^