문제

의 차이점은 무엇입니 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 계속해서 달릴 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top