2014-11-07 10 views
6

나는 특히 Python의 C-API에서 continuations에 관심이 있습니다. 내가 이해하는 바에 따르면, 연속성은 필요에 따라 호출 스택을 조작하기 위해 저수준 호출 규칙을 추상화해야합니다. 나는이 흩어져있는 herethere의 몇 가지 예를 발견 할만큼 충분히 운이 좋았습니다. 몇 가지 예를 들자면,이 추상화는 영리한 C (환경에 대한 가정 포함) 또는 사용자 정의 어셈블리를 사용하여 수행됩니다.연속적인 PyFrameObject를 인풋과 아웃으로 전환 할 수 있습니까?

그러나 파이썬에 대한 멋진 점은 PyFrameObject으로 구성된 자체 인터프리터 스택이 있다는 것입니다. 이제는 단일 스레드 응용 프로그램을 가정 할 때 은 파이썬의 C-API에서 연속을 구현하기 위해 인출하기 위해 PyFrameObjects을 스위치하는 것만으로 충분하지 않아야합니까? 왜이 저자들은 저급의 것을 다루는가?

+0

저는 정말로 대답 할 수 없지만 최적화가 떠오릅니다. 좋은 질문! – ThinkChaos

+2

프레임 객체를 교환하는 것은 기본적으로 생성기 기능이 작동하는 방식입니다. 'yield'를 누르면 현재 프레임 오브젝트가 생성기에 저장되고 스택에서 팝됩니다. 다음 값이 필요할 때, 프레임 객체는 스택에 푸시 백되고 실행은 중단 된 곳에서 계속 실행됩니다. –

답변

1

발전기는 프레임 개체의 스택 (실제로 링크 된 목록)을 조작하여 작동합니다. 그러나 이것은 순수한 파이썬 코드에만 도움이 될 것입니다. 코드에 C 코드가 실행중인 경우에는 도움이되지 않습니다. 예를 들어, I/O 루틴 내에서 C 코드를 사용하는 경우 Python 프레임 객체를 변경하여 실행을 다른 곳으로 이동시킬 수 없습니다. C 스택을 변경하려면이를 수행 할 수 있어야합니다. 그게 너에게 청과대 같은 것들을 해준다.

+0

이것이 답이라고 생각합니다. 흥미롭게도, C에서 구현 된 부분이 연속 페스트에 참여할 필요가 없다면,'PyFrameObject' *를 조작하면 충분할 것이라고 생각합니다. 사실 이것은 발전기와 코 루틴에 의해 어느 정도 입증됩니다. – Julian