2009-04-16 4 views
15

Nie jestem pewien, dlaczego istnieje API podinterpretacji i dlaczego jest on używany w modułach takich jak moduł mod_wsgi. Czy jest używany głównie do tworzenia obszaru izolowanego zabezpieczeń dla różnych aplikacji działających w tym samym procesie, czy też jest sposobem na współbieżność z wieloma wątkami? Może obydwa? Czy są inne cele?Jaki jest cel API interpretera w CPython?

Odpowiedz

14

Wyobrażam sobie, że celem jest stworzenie oddzielnych środowisk wykonawczych Pythona. Na przykład: mod_wsgi (moduł Apache Python) hostuje jednego interpretera pythonów, a następnie hostuje wiele aplikacji w podprocesorze (w domyślnej konfiguracji).

Niektóre kluczowe punkty z documentation:

  • To jest (prawie) całkowicie oddzielne środowisko do wykonywania kodu Pythona. W szczególności nowy interpreter ma oddzielne, niezależne wersje wszystkich importowanych modułów, w tym podstawowe moduły: __builtin__, ,i sys.
  • Tabela załadowanych modułów (sys.modules) i ścieżka wyszukiwania modułów (sys.path) są również oddzielne.
  • Ponieważ podprocesory (i główny interpreter) są częścią tego samego procesu, izolacja między nimi nie jest idealna - na przykład za pomocą operacji na plikach o niskim poziomie, takich jak os.close() mogą (przypadkowo lub złośliwie) wpływają na otwarte pliki nawzajem.
  • Z powodu sposobu, w jaki rozszerzenia są dzielone między (pod) interpretatory, niektóre rozszerzenia mogą nie działać poprawnie; jest to szczególnie prawdopodobne, gdy rozszerzenie korzysta ze (statycznych) zmiennych globalnych lub gdy rozszerzenie manipuluje słownikiem swojego modułu po jego inicjalizacji.
+0

Czy to oznacza, że ​​różni tłumacze mogą pracować jednocześnie w różnych wątkach? Nadal nie jestem pewien, czy różni tłumacze w tym samym procesie mają ten sam GIL. –

+3

GIL jest obiektem globalnym dla tego procesu i jest dzielony między podinterpretatorami. Więc nie, nie mogą biegać jednocześnie. http://objectmix.com/python/377035-multiple-independent-python-interpreters-c-c-program.html – codeape

+0

Dzięki za link! Próbowałem dowiedzieć się, czy jest jakiś sposób obejścia ograniczeń Pythona i GIL, i nie wymyślę niczego. –

0

Jak rozumieć to ostatnie, pomysł był aby móc wykonać wiele aplikacji, jak również wiele kopii tej samej aplikacji ramach tego samego procesu.

Jest to funkcja w innych językach skryptowych (np TCL) i jest szczególnie użyteczna dla gui budowniczych, serwery WWW, itp

Łamie w Pythonie ponieważ wiele rozszerzeń nie są bezpieczne wielokrotnego tłumacza, więc jedno działanie tłumacza może wpłynąć na zmienne w innym tłumaczu.