코루틴 대 연속 대 생성기
코루틴과 연속 및 발전기의 차이점은 무엇입니까?
발전기부터 시작하겠습니다. 가장 단순한 경우입니다.@zvolkov가 언급했듯이, 반환하지 않고 반복적으로 호출할 수 있는 함수/개체이지만, 호출되면 값이 반환(수익)된 다음 실행이 중단됩니다.그들이 다시 호출되면, 그들은 그들이 마지막으로 집행을 중단했던 곳에서 시작해서 다시 그들의 일을 할 것입니다.
제너레이터는 기본적으로 절단된(비대칭) 코루틴입니다.코루틴과 생성기의 차이점은 코루틴은 처음에 호출된 후에 인수를 수락할 수 있는 반면 생성기는 수락할 수 없다는 것입니다.
코루틴을 어디에 사용할 것인지에 대한 사소한 예를 생각해 내는 것은 조금 어렵지만, 여기 제 최선의 시도가 있습니다.이 (구성된) 파이썬 코드를 예로 들어 보겠습니다.
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
코루틴이 사용되는 곳의 예로는 렉서와 파서가 있습니다.언어에 코루틴이 없거나 에뮬레이트되지 않은 경우, 렉싱과 구문 분석 코드는 두 가지 별개의 문제임에도 불구하고 함께 혼합되어야 합니다.하지만 코루틴을 사용하면 렉싱 코드와 구문 분석 코드를 분리할 수 있습니다.
(저는 대칭적인 코루틴과 비대칭적인 코루틴의 차이점을 설명하겠습니다.그것들이 동등하다고 말하면, 당신은 하나에서 다른 하나로 변환할 수 있고, 발전기와 가장 유사한 비대칭 코루틴은 이해하기 더 쉽습니다.저는 파이썬에서 비대칭 코루틴을 구현하는 방법에 대해 개략적으로 설명했습니다.)
연속은 사실 꽤 단순한 짐승입니다.이것들은 모두 프로그램의 다른 지점을 나타내는 함수이며, 호출하면 실행이 함수가 나타내는 지점으로 자동으로 전환됩니다.당신은 그것들의 매우 제한된 버전을 매일 그것들을 깨닫지도 못하고 사용합니다.예를 들어 예외는 일종의 내부-외부 연속이라고 생각할 수 있습니다.Python 기반의 의사 코드의 예를 연속으로 보여드리겠습니다.
파이썬에 다음과 같은 기능이 있었다고 가정합니다.callcc()
그리고 이 함수는 두 개의 인수를 사용했습니다. 첫 번째는 함수이고 두 번째는 이를 호출할 인수 목록입니다.이 함수에 대한 유일한 제한은 이 함수가 사용하는 마지막 인수가 함수가 될 것이라는 것입니다(현재 연속 함수가 될 것입니다).
def foo(x, y, cc):
cc(max(x, y))
biggest = callcc(foo, [23, 42])
print biggest
어떻게 될까요?callcc()
로 차차례방것문할로례것▁in▁would를 부를 것입니다.foo()
현재 계속(cc
), 즉, 프로그램의 포인트에 대한 참조입니다.callcc()
호출되었습니다. 때foo()
계속을 것입니다. 본질적으로 말하는 것과 같습니다.callcc()
이 이 현재 연속이. " " " " 를 때, " " " " " " " " " 를 호출했을 때 이 롤백됩니다.callcc()
.
이 모든 것의 결과는 가상의 파이썬 변형이 인쇄될 것입니다.'42'
.
코루틴은 그룹의 다른 코루틴을 제어하기 위해 교대로 작업을 수행한 다음 일시 중지하는 여러 절차 중 하나입니다.
계속은 일부 절차에 전달하는 "함수에 대한 포인터"로, 해당 절차가 완료될 때 실행("계속")됩니다.
생성기(.NET)는 값을 뱉어내고 메서드의 실행을 "일시 중지"한 다음 다음 값을 요청할 때 동일한 지점에서 진행할 수 있는 언어 구조입니다.
Python에서는 Generators와 함께 수 .generator.send()
파이썬 제너레이터를 효과적으로 코루틴으로 만듭니다.
greenlet이라고 하는 파이썬 제너레이터와 다른 제너레이터의 주요 차이점은 파이썬에서yield value
발신자에게만 돌아갈 수 있습니다.그린렛에 있는 동안,target.switch(value)
특정한 목표 코루틴으로 당신을 데리고 갈 수 있고, 다음과 같은 값을 산출할 수 있습니다.target
계속 실행됩니다.
언급URL : https://stackoverflow.com/questions/715758/coroutine-vs-continuation-vs-generator
'bestsource' 카테고리의 다른 글
COUNTIFS에서 OR & AND 사용 (0) | 2023.06.08 |
---|---|
Angular 6의 Http 오류 처리 (0) | 2023.06.08 |
웹 서버에서 디버깅을 시작할 수 없습니다.ASP.NET 디버깅 VS 2010, II7, Win 7 x64를 시작할 수 없음 (0) | 2023.06.08 |
셀 형식을 텍스트로 설정하는 방법 (0) | 2023.06.08 |
주피터 연구실에 콘다 환경을 추가하는 방법 (0) | 2023.06.08 |