Я пытаюсь цепь вместе два 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'
Если бы я должен был догадаться, что испытывает проблемы с 'self' аргумента. Когда цепочка первого аргумента второй задачи - это возврат из первой задачи, поэтому в вашем экземпляре 'self = 3', но s никогда не будет установлен, следовательно, ошибка 1 дает. – user2097159
@ user2097159 Если я делаю следующее: '>>> s = (a.add.s (1,2) | a.show.s (a)). Delay(). Get()', s устанавливается в a, объект instanced A. –