В stackless Python вы можете отправить канал по каналу?

StackOverflow https://stackoverflow.com/questions/638464

Вопрос

У меня нет без штабелей в настоящее время запущен, поэтому я не могу попробовать это сам.

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

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

Являются сн2 и сн3 тогда по тому же каналу?Сказать:

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

Эта особенность напомнила мне о поговорим о новостях этот Роберт Пайк (из План9 известность), предоставленный в Google.В Newsqueak вы можете отправлять каналы по каналам.

Это было полезно?

Решение

ДА.Только что проверено.

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

Другие советы

Каналы отправляют нормальные ссылки на Python, поэтому отправляемые вами данные (канал, строка и т. д.) в точности соответствуют полученным.

Одним из примеров отправки канала по каналу является использование тасклета в качестве службы, то есть тасклет прослушивает запросы на канале, выполняет работу и возвращает результат. Запрос должен включать данные для работы и обратный канал для результата, чтобы результат передавался запрашивающей стороне.

Вот экстремальный пример, который я разработал для своего разговора без стеков на PyCon несколько лет назад. Это создает новый тасклет для каждого вызова функции, так что я могу использовать рекурсивную реализацию факториала, которому не нужно беспокоиться об ограничении стека Python. Я выделяю тасклет для каждого вызова, и он получает обратный канал для результата.

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)

Вывод:

5! = 120 
1000! / 998! = 999000

У меня есть несколько других примеров отправки каналов по каналам в моей презентации. Это обычная вещь в Stackless.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top