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?
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.
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.
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