W jaki sposób generatory i koroutiny są implementowane w CPython?

Czytałem, że w Cpythonie stos interpretera (lista funkcji Pythona wywołanych do osiągnięcia tego punktu) jest mieszany ze stosem C (lista funkcji C wywołanych w kodzie interpretera). Jeśli tak, to w jaki sposób wdrażane są generatory i koroutiny? Jak zapamiętują swój stan egzekucji? Czy CPython kopiuje stos każdego generatora / coroutine ' a do i ze stosu systemu operacyjnego? A może CPython po prostu trzyma na stercie najwyższą ramkę stosu generatora, ponieważ generator może się oddawać tylko z tej najwyższej klatki?

Author: A. Jesse Jiryu Davis, 2011-12-05

2 answers

Instrukcja yield przyjmuje bieżący kontekst wykonania jako zamknięcie i przekształca go we własny żywy obiekt. Obiekt ten posiada metodę __iter__, która będzie kontynuowana po tej instrukcji yield.

Więc stos wywołań zostanie przekształcony w obiekt heap.

 18
Author: Rudi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-05 18:32:39

Pogląd, że stos Pythona i stos C w uruchomionym programie Pythona są mieszane, może być mylący.

Stos Pythona jest czymś całkowicie oddzielonym od rzeczywistego stosu C używanego przez interpreter. Struktury danych na stosie Pythona są w rzeczywistości pełnymi obiektami Pythona "frame" (które mogą być nawet introspekcyjne i mieć pewne atrybuty zmienione w czasie wykonywania). Ten stos jest zarządzany przez maszynę wirtualną Pythona, która sama działa w C, a więc ma normalny program C, maszynę / align = "left" /

Podczas korzystania z generatorów i iteratorów, interpreter po prostu przechowuje odpowiedni obiekt ramki gdzieś indziej niż na stosie programu Pythona i odsyła go tam, gdy wznawia wykonywanie generatora. Tym" gdzie indziej " jest sam obiekt generatora.Wywołanie metody" next "lub" send " w obiekcie generatora powoduje takie działanie.

 51
Author: jsbueno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-05 20:26:02