TypeError Celery 即使参数正确
TypeError Celery even on correct arguments
我同时使用 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 控制台中工作。但是对于任务中的单个参数,它会引发 TypeError 并显示消息 (x given)
,其中 x 是我传递的字符串的长度。在上面的示例中,它的 random
产生 6。这是芹菜中的错误还是我的代码某处有误?
我承认我不是 Celery 专家,但是 documentation for the apply_async
method 指出参数 args
必须是一个元组。鉴于行
中的双括号,您似乎正在尝试使用元组调用此函数
print twitterDP.apply_async(("random"))
但您还没有完全掌握如何在 Python 中创建一元组。
("random")
只是一个带括号的字符串,与"random"
具有相同的值。要将其变成 1 元组,请在括号内添加尾随逗号,即 ("random",)
。上面的行应该是
print twitterDP.apply_async(("random",))
数字 6 可能作为字符串 random
中的字符数出现。尝试输入 different-length 字符串,看看是否得到不同的数字。
我同时使用 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 控制台中工作。但是对于任务中的单个参数,它会引发 TypeError 并显示消息 (x given)
,其中 x 是我传递的字符串的长度。在上面的示例中,它的 random
产生 6。这是芹菜中的错误还是我的代码某处有误?
我承认我不是 Celery 专家,但是 documentation for the apply_async
method 指出参数 args
必须是一个元组。鉴于行
print twitterDP.apply_async(("random"))
但您还没有完全掌握如何在 Python 中创建一元组。
("random")
只是一个带括号的字符串,与"random"
具有相同的值。要将其变成 1 元组,请在括号内添加尾随逗号,即 ("random",)
。上面的行应该是
print twitterDP.apply_async(("random",))
数字 6 可能作为字符串 random
中的字符数出现。尝试输入 different-length 字符串,看看是否得到不同的数字。