TypeError Celery甚至是正确的参数

时间:2017-01-26 21:51:32

标签: python celery django-celery

我一起使用Celery和Redis。我在tasks.py文件中有以下代码:

from celery import Celery
from faker import Factory
fake = Factory.create()

app = Celery("tasks")
app.conf.broker_url = 'redis://localhost:6379/0'
app.conf.result_backend = 'redis://localhost:6379/0'

@app.task
def twitterDP(hashtag):
    if hashtag:
        return ["From Twitter " + fake.text(20) + " hashtag # " + hashtag for x in range(5)]
    return []

并且为了运行任务,我还有另一个包含以下代码的脚本:

import zmq
from tasks import twitterDP
from celery.result import AsyncResult

import time

class WorkFlow(object):
    def __init__(self):
        self.ctx = zmq.Context()
        self.socket_pull = self.ctx.socket(zmq.PULL)
        self.socket_pull.bind("tcp://127.0.0.1:5860")

    def do_work(self):
        while True:
            recv_msg = self.socket_pull.recv_json()
            print twitterDP.apply_async(("random"))
             time.sleep(1)

if __name__ == "__main__":
    wf = WorkFlow()
    wf.do_work()

虽然celery任务的参数看起来很好,但它给了我错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/sarvagya/Desktop/work/django_work/ed3/venv/lib/python2.7/site-packages/celery/app/task.py", line 517, in apply_async
    check_arguments(*(args or ()), **(kwargs or {}))
TypeError: twitterDP() takes exactly 1 argument (6 given)

如果我为twitterDP函数使用两个参数,它可以在python控制台中使用。但是对于task中的单个参数,它使用消息(x given)引发了TypeError,其中x是我传递的字符串的长度。在上面的示例中,它的random产生6.这是芹菜中的错误还是我的代码在某处错了?

1 个答案:

答案 0 :(得分:3)

我承认不是Celery专家,但documentation for the apply_async method声明参数args必须是元组。看起来你试图用一个元组调用这个函数,给定行中的加倍括号

    print twitterDP.apply_async(("random"))

但你还没有完全掌握如何在Python中创建1元组。

("random")只是带括号的字符串,其值与"random"相同。要将其变为1元组,请在括号内添加尾随逗号,即("random",)。然后上面的行应该读

    print twitterDP.apply_async(("random",))

数字6可能是字符串random中的字符数。尝试使用不同长度的字符串,看看是否有不同的数字。