Coroutine vs 연속 대 발전기
-
23-08-2019 - |
문제
의 차이점은 무엇입니 coroutine 연속 및 발전기?
해결책
시작으로 발전기를보고,그들은 간단한 경우입니다.로@zvolkov 언급한,그들은 함수/할 수 있는 개체는 반복적으로 반환하지 않고 있지만,때 호출이 반환(수율)값과 다를 일시 중단로 실행됩니다.때 그들은 다시 호출로,그들은 시작됩니다 어디에서 그들이 마지막으로 중단된 실행 및 그들의 일을 다시합니다.
발전기는 기본적으로 아래로 절단(asymmetric)coroutine.의 차이 coroutine 및 생성기는 coroutine 인수를 받아들일 수 있습한 후 처음이라고 하는 반면,발전기 할 수 없습니다.
그것은 약간을 만들어 낸다는 것은 매우 어려운 일단의는 다음을 사용할 수 있습니다 하지만,여기 나의 최고의보십시오.이(만)Python 코드로는 예입니다.
def my_coroutine_body(*args):
while True:
# Do some funky stuff
*args = yield value_im_returning
# Do some more funky stuff
my_coro = make_coroutine(my_coroutine_body)
x = 0
while True:
# The coroutine does some funky stuff to x, and returns a new value.
x = my_coro(x)
print x
예를 하는 데 사용되는 lexers 및 parsers.지 않고 하 언어에서 에뮬레이트나 어떻게든,lexing 및 분석 코드를 필요로 함께 혼합하더라도 그들은 정말 두 가지 별도의 문제입니다.그러나 사용하여 coroutine,할 수 있는 별도의 lexing 및 분석 코드입니다.
(나는 브러시의 차이에 대해 대칭 및 비대칭형 하.는 것을 말하는 것으로 충분하다 그들이 동일로 변환할 수 있습니다 다른 하나에서,그리고 비대칭형 하--있는 가장 좋아하는 발전기--은 더 쉽게 이해할 수 있습니다.나 개요 방법 중 하나를 구현할 수도 있습니다 비대칭형 하에 있습니다.)
연속 작업은 실제로 아주 간단한 짐승입니다.모든 그들은,는 기능을 대표하는 또 다른 점은 프로그램에서는,호출하는 경우,그것이 원인을 실행하는 자동으로 전환하는 기능을 나타냅니다.당신이 사용하여 매우 제한된 버전의 매일 그들지 않고도 깨닫습니다.예외에 대한 인스턴스로 생각할 수 있습의 종류 안에서 밖으로 지정합니다.내가 당신에게 Python 기반의 의사 코드 예제의 연속이다.
말 Python 기능을 가지고 있었라 callcc()
, 이 기능을 했는 두 개의 인수,첫 번째는 함수이고,두 번째는 인수 목록에 그것을 부르다.만 제한하는 기능을 것이는 마지막 인수 받을 수 있는 기능(는 것이 우리의 현재 계속).
def foo(x, y, cc):
cc(max(x, y))
biggest = callcc(foo, [23, 42])
print biggest
무슨 일이 일어날 것입 callcc()
에서 차례로 콜 foo()
현재 계속(cc
),그 참조는 지점에는 프로그램 callcc()
에 부름을 받았습니다.면 foo()
전화는 현재 계속,그것은 본질적으로 같은 말 callcc()
를 반환하는 값으로 당신을 호출하면 현재 계속하고,때는 다시 어디에 스택 현재 연속 생성,즉 때,당신은 불 callcc()
.
의 결과는 이 모든 것을 우리의 가 Python 변형 것 인쇄 '42'
.
도움이 되기를 바랍니다,그리고 나는 나의 설명에 향상시킬 수있는 꽤!
다른 팁
Coroutine은 차례대로 작업을 수행 한 다음 그룹의 다른 코 루틴을 제어하기 위해 잠시 멈추는 여러 절차 중 하나입니다.
연속은 "함수에 대한 포인터"로, 해당 절차가 완료되면 실행되기 위해 일부 절차로 전달됩니다 ( "계속").
Generator (.NET)는 값을 뱉을 수있는 언어 구조물입니다. 방법의 "일시 정지"실행 후 다음 값을 요청할 때 같은 지점에서 진행합니다.
최신 버전의 Python에서는 Generator에 값을 보낼 수 있습니다. generator.send()
, 파이썬 생성기를 효과적으로 코 루틴으로 만듭니다.
Python Generator와 다른 발전기 인 Greenlet의 주요 차이점은 Python에서 yield value
발신자에게만 돌아갈 수 있습니다. Greenlet에있는 동안 target.switch(value)
특정 대상 코 루틴으로 안내하고 target
계속해서 달릴 것입니다.