Frage

Ich habe nicht stackless zur Zeit läuft, so kann ich das selbst nicht versuchen.

import stackless
ch1 = stackless.channel()
ch2 = stackless.channel()

ch1.send(ch2)
ch3 = ch1.receive()

Ist ch2 und ch3 dann der gleiche Kanal? Sprich:

text = "Hallo"
ch2.send(text)
assert text == ch3.receive()

Diese Funktion erinnert mich an ein Vortrag über Newsqueak dass Robert Pike (von < a href = "http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs" rel = "nofollow noreferrer"> Plan9 Ruhm) gab bei Google. In Newsqueak könnten Sie Kanäle über Kanäle senden.

War es hilfreich?

Lösung

Ja. Gerade getestet.

>>> import stackless
>>> ch1 = stackless.channel()
>>> def a():
...  ch2 = stackless.channel()
...  ch1.send(ch2)
...  ch2.send("Hello")
...
>>> def b():
...  ch3 = ch1.receive()
...  print ch3.receive()
...
>>> stackless.tasklet(a)()
<stackless.tasklet object at 0x01C6FCB0>
>>> stackless.tasklet(b)()
<stackless.tasklet object at 0x01C6FAB0>
>>> stackless.run()
Hello

Andere Tipps

Kanäle senden normale Python Referenzen, so dass Sie die Daten senden (Kanal, Bindfaden, was auch immer) ist genau das, was empfangen wird.

Ein Beispiel einen Kanal über einen Kanal zu senden, wenn Sie einen Tasklet als Dienst verwenden, das heißt, ein Tasklet auf einem Kanal für Anforderungen überwacht, funktioniert, und gibt das Ergebnis. Der Antrag muss die Daten für die Arbeit und der Rückkanal für das Ergebnis umfassen, so dass das Ergebnis an den Anforderer geht.

Hier ist ein extremes Beispiel, das ich für meinen Stackless bei PyCon Gespräch vor ein paar Jahren . Dadurch wird eine neue Tasklet für jeden Funktionsaufruf, damit ich eine rekursive Implementierung von Fakultäts verwenden kann, die brauchen nicht über Python Stack Limit zu kümmern. I zuzuteilen einen Tasklet für jeden Anruf, und es wird den Rücklaufkanal 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 weiteren Beispiele für Kanäle über Kanäle in meiner Präsentation zu senden. Es ist eine gemeinsame Sache in Stackless.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top