Python 链接芹菜任务方法错误

Python 链接芹菜任务方法错误,python,celery,chaining,chain,Python,Celery,Chaining,Chain,我试图使用芹菜将两个task_方法链接在一起,但我得到以下错误: 错误: >>> 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 "/u

我试图使用芹菜将两个task_方法链接在一起,但我得到以下错误:

错误:

>>> 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)
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
...
def show(s,self):
    print s
    return s
...
芹菜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_方法与芹菜链接起来了吗?谢谢

编辑:还值得注意的是,以下代码是成功的:

>>> from proj.tasks import A
>>> a = A()
>>> sum = a.add.s(1,2).delay().get()
>>> show = a.show.s(sum).delay().get()
另外,我知道有人可能会说这些函数不需要在类中,而是假装它们在类中。我使用简单的函数来帮助说明这个问题

编辑

我已经找到了一个解决办法,但仍然需要更好的解决方案:

首先,修改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()
会返回以下错误:

TypeError:s()为关键字参数“self”获取了多个值

这并不理想,因为只有在链中才能调用show函数

例如,以下问题:

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


芹菜的创建者Ask Solem Hoel说,任务方法是一个“失败的实验”,将不再得到支持。我想这回答了我的问题——目前还不能做到


如果我不得不猜测它与
self
参数有问题。链接第二个任务的第一个参数时,它是第一个任务的返回值,因此在您的实例中,
self=3
,但是s永远不会被设置,因此会出现1 give错误。@如果我执行以下操作,则使用2097159:
>>s=(a.add.s(1,2)| a.show.s(a)).delay().get()
,s被设置为a,实例化的对象。
>>> a.show(s='test',self=a)
TypeError: __call__() got multiple values for keyword argument 'self'