Kanäle normale Python Referenzen, so dass die Daten senden Sie senden (Kanal, Bindfaden, was auch immer) ist genau das, was empfangen wird.
Ein Beispiel für das Senden eines Kanals über einen Kanal ist, wenn Sie ein Tasklet als Dienst verwenden, dh ein Tasklet hört auf einem Kanal nach Anforderungen ab, funktioniert und gibt das Ergebnis zurück. Die Anforderung muss die Daten für die Arbeit und den Rückkanal für das Ergebnis enthalten, damit das Ergebnis an den Anforderer gesendet wird.
Hier ist ein extremes Beispiel, das ich vor ein paar Jahren für meine Stackless talk at PyCon entwickelt habe. Dadurch wird für jeden Funktionsaufruf ein neues Tasklet erstellt, sodass ich eine rekursive Implementierung von factorial verwenden kann, die sich nicht um Pythons Stack-Limit kümmern muss. Ich weise für jeden Anruf ein Tasklet zu und es erhält den Rückkanal für das Ergebnis.
import stackless
def call_wrapper(f, args, kwargs, result_ch):
result_ch.send(f(*args, **kwargs))
# ... should also catch and forward exceptions ...
def call(f, *args, **kwargs):
result_ch = stackless.channel()
stackless.tasklet(call_wrapper)(f, args, kwargs, result_ch)
return result_ch.receive()
def factorial(n):
if n <= 1:
return 1
return n * call(factorial, n-1)
print "5! =", factorial(5)
print "1000!/998! =", factorial(1000)/factorial(998)
Die Ausgabe lautet:
5! = 120
1000!/998! = 999000
Ich habe ein paar weitere Beispiele für Kanäle über Kanäle in meiner Präsentation zu senden. Es ist eine gemeinsame Sache in Stackless.
Komisch das würde kommen, ich dachte die genaue Sache über Stackless und wie ich liebe, dass es Kanäle wie Go/Newsqueak haben. – Jyaan