2017-01-26 4 views
0

Я использую сельдерей и Redis вместе. У меня следующий код в моем tasks.py файле:ТипError Сельдерей даже по правильным аргументам

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() 

событие, хотя аргумент для выполнения этой задачи сельдерея выглядит хорошо, он дает мне ошибку:

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 функций, она работала в консоли питона. Но для одного параметра в задаче он поднял TypeError с сообщением (x given), где x - длина строки, которую я передал. В приведенном выше примере его random, который дает 6. Является ли это ошибкой в ​​сельдерее или где-то мой код?

ответ

2

Я признаю, что не являюсь экспертом по сельдерей, но documentation for the apply_async method утверждает, что параметр args должен быть кортежем. Похоже, что вы пытаетесь вызвать эту функцию с кортежем, учитывая удвоенные скобки в строке

print twitterDP.apply_async(("random")) 

но вы не совсем освоены, как создать 1-кортеж в Python.

("random") - это всего лишь строка в скобках с таким же значением, как "random". Чтобы сделать это в 1-кортеж, добавьте конечную запятую в круглые скобки, то есть ("random",). Линия выше должна затем прочитать

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

Вполне возможно, что число 6 возникает как число символов в строке random. Попробуйте строку другой длины и посмотрите, есть ли у вас другое число.

+0

Да. Это то, что происходит, когда у вас недостаточно кофе. Спасибо, что исправил проблему. – Pant

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