2017-01-26 1 views
0

Ich benutze Sellerie und Redis zusammen. Ich habe folgenden Code in meiner tasks.py Datei:TypeError Sellerie auch bei richtigen Argumenten

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 [] 

und die Aufgaben zu laufen, ich habe noch ein anderes Skript, das den folgenden Code enthält:

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

Ereignis obwohl das Argument für die Sellerie Aufgabe sieht gut aus, es gibt mir eine Fehlermeldung:

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) 

Wenn ich zwei Parameter für meine twitterDP Funktionen, es in der python-Konsole gearbeitet. Aber für einen einzelnen Parameter in der Task hat er TypeError mit der Nachricht (x given) ausgelöst, wobei x die Länge der übergebenen Zeichenfolge ist. Im obigen Beispiel ist es random, was 6 ergibt. Ist das ein Fehler in Sellerie oder ist mein Code irgendwo falsch?

Antwort

2

Ich gebe zu, kein Sellerie-Experte zu sein, aber die documentation for the apply_async method besagt, dass der Parameter args ein Tupel sein muss. Es sieht aus wie Sie diese Funktion aufrufen, mit einem Tupel versuchen, angesichts der verdoppelten Klammern in der Zeile

print twitterDP.apply_async(("random")) 

aber Sie haben nicht ganz beherrscht, wie ein 1-Tupel in Python zu erstellen.

("random") ist nur ein geklammerter String mit dem gleichen Wert wie "random". Um dies zu einem 1-Tupel zu machen, füge ein abschließendes Komma in die Klammern ein, d. H. ("random",). Die Zeile oben sollte dann lesen

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

Es ist möglich, dass die Zahl 6 stellt sich die Anzahl der Zeichen in der Zeichenkette random. Versuchen Sie eine Zeichenfolge mit unterschiedlicher Länge und sehen Sie, ob Sie eine andere Nummer erhalten.

+0

Ja. Dies passiert, wenn Sie nicht genug Kaffee haben. Danke, das hat das Problem behoben. – Pant

Verwandte Themen