채널은 정상적인 Python 참조를 전송하므로 사용자가 보내는 데이터 (채널, 문자열 등)는 정확히 수신됩니다.
채널을 통해 채널을 전송하는 한 가지 예는 태스크 릿을 서비스로 사용하는 경우입니다. 즉, 태스크 릿릿은 요청에 대한 채널을 수신하고 작동하고 결과를 반환합니다. 요청에는 작업 데이터와 결과에 대한 반환 채널이 포함되어야 결과가 요청자에게 전달됩니다.
몇 년 전 나의 Stackless talk at PyCon에 대해 개발 한 극단적 인 예입니다. 이것은 각 함수 호출을위한 새로운 태스크 릿을 생성하므로 파이썬의 스택 한계에 대해 걱정할 필요가없는 계승의 재귀 적 구현을 사용할 수 있습니다. 나는 각 호출에 대해 tasklet을 할당하고 결과에 대한 리턴 채널을 얻는다.
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에서는 공통점이 있습니다.
재밌 네요. Stackless에 대해 정확히 생각하고 있었고 Go/Newsqueak과 같은 채널을 가지고있는 것을 좋아합니다. – Jyaan