2016-07-14 4 views
1

Ich weiß, | ist ein bitweises 'Oder' Operator, aber es macht mich wundern, dass, wie es im Falle von Sellerie funktioniert, während mehrere Aufgaben verketten.Sellerie: Wie '|' Operator arbeitet während der Verkettung mehrerer Aufgaben?

(first_task.s(url) | second_tasks.s()).apply_async() 

Ich weiß, dass zweite Aufgabe Ergebnis der ersten Funktion als Args nehmen würde, aber wie ist das möglich? Wo ist '|' Überladen in dj-Sellerie Quellcode?

@task 
def second_task(results): 
    do_something(results) 

Kann jemand bitte einige Einblicke liefern?

Antwort

0

Sie wahrscheinlich Betreiber verwenden Überlastung als __or__(self, other): http://www.rafekettler.com/magicmethods.html

ich die Details der Implementierung von Sellerie nicht kennen, sondern nur um Ihnen eine Vorstellung zu geben:

class Task(object): 
    def __init__(self, name): 
     self.name = name 
     self.chain = [self] 

    def __or__(self, other): 
     self.chain.append(other) 
     return self 

    def __repr__(self): 
     return self.name 

    def apply_async(self): 
     for c in self.chain: 
      print "applying", c 


(Task('A') | Task('B') | Task('C')).apply_async() 

Ausgang:

applying A 
applying B 
applying C 
0

Wie oben erwähnt, überschreibt Sellerie den Operator __or__, insbesondere wie folgt:

def __or__(self, other): 
    if isinstance(other, group): 
     other = maybe_unroll_group(other) 
    if not isinstance(self, chain) and isinstance(other, chain): 
     return chain((self,) + other.tasks, app=self._app) 
    elif isinstance(other, chain): 
     return chain(*self.tasks + other.tasks, app=self._app) 
    elif isinstance(other, Signature): 
     if isinstance(self, chain): 
      return chain(*self.tasks + (other,), app=self._app) 
     return chain(self, other, app=self._app) 
    return NotImplemented 

Die vollständige Umsetzung ist hier: https://github.com/celery/celery/blob/master/celery/canvas.py#L324

Verwandte Themen