Do czego miałbym używać Pythona bez stosu?

Istnieje wiele pytań związanych z Pythonem bez stosu. Ale nikt nie odpowiada na to moje pytanie, myślę (popraw mnie, jeśli źle-proszę!). Cały czas jest o tym głośno, więc jestem ciekaw. Do czego miałbym używać Stackless? Jak to jest lepsze niż CPython?

Tak, ma zielone wątki (bez stosu), które pozwalają na szybkie tworzenie wielu lekkich wątków, o ile żadne operacje nie są blokowane (coś jak wątki Ruby?). Do czego to służy? Jakie inne funkcje ma chcę użyć nad CPython?

Author: zaharpopov, 2010-02-08

6 answers

Pozwala na pracę z ogromną ilością współbieżności. Nikt przy zdrowych zmysłach nie stworzyłby stu tysięcy wątków systemowych, ale można to zrobić za pomocą stackless.

Ten artykuł testuje właśnie to, tworząc sto tysięcy zadań zarówno w Pythonie, jak i Google Go (nowy język programowania): http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

O dziwo, nawet jeśli Google Go zostanie skompilowany do kodu natywnego, a oni tout ich implementacja co-procedur, Python wciąż wygrywa.

Stackless byłoby dobre dla implementacji algorytmu map/reduce, gdzie można mieć bardzo dużą liczbę reduktorów w zależności od danych wejściowych.

 29
Author: Adal,
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
2014-07-14 18:56:41

Główną zaletą Pythona bez stosu jest obsługa bardzo lekkich rdzeni. CPython nie obsługuje corutines natywnie (chociaż oczekuję, że ktoś opublikuje hack oparty na generatorze w komentarzach), więc Stackless jest wyraźną poprawą na CPython, gdy masz problem, który korzysta z corutines.

Myślę, że głównym obszarem, w którym excel są, Gdy masz wiele jednoczesnych zadań uruchomionych w programie. Przykładami mogą być encje gry, które uruchamiają skrypt zapętlający dla swoich AI, czyli serwer WWW obsługujący wielu klientów ze stronami, które są powolne w tworzeniu.

Nadal masz wiele typowych problemów z poprawnością współbieżności w odniesieniu do współdzielonych danych, ale deterministyczne przełączanie zadań ułatwia pisanie bezpiecznego kodu, ponieważ wiesz dokładnie, gdzie kontrola zostanie przeniesiona i dlatego znasz dokładne punkty, w których współdzielony stan musi być aktualny.

 12
Author: Kylotan,
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
2010-02-08 10:58:20

Thirler już wspomniał, że stackless został użyty w Eve Online. Należy pamiętać, że:

(..) stackless dodaje do tego kolejny zwrot, pozwalając na rozdzielenie zadań na mniejsze zadania, Tasklety, które mogą być następnie rozdzielone od głównego programu, aby wykonać je samodzielnie. Może być używany do zadań typu fire-and-forget, takich jak wysyłanie wiadomości e-mail lub wysyłanie zdarzenia, lub do operacji IO, np. wysyłanie i odbieranie pakietów sieciowych. Jedno zadanie czeka na pakiet z sieć, podczas gdy inni kontynuują uruchamianie pętli gry.

Jest pod pewnymi względami podobny do wątków, ale nie jest prewencyjny i wyraźnie zaplanowany, więc jest mniej problemów z synchronizacją. Ponadto przełączanie między zadaniami jest znacznie szybsze niż przełączanie wątków i możesz mieć ogromną liczbę aktywnych zadań, podczas gdy liczba wątków jest poważnie ograniczona przez sprzęt komputerowy.

(mam ten cytat z tutaj )

Na PyCon 2009 podano bardzo ciekawa rozmowa , opisująca dlaczego i w jaki sposób Stackless jest używany w grach CCP.

Istnieje również bardzo dobry materiał wprowadzający , który opisuje, dlaczego stackless jest dobrym rozwiązaniem dla Twoich aplikacji. (może i jest trochę stary, ale myślę, że warto go przeczytać).

 8
Author: zeroDivisible,
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
2014-05-12 11:52:35

EVEOnline jest w dużej mierze programowany w Pythonie bez stosu. Mają kilka blogów deweloperów na temat korzystania z niego. Wydaje się, że jest to bardzo przydatne dla obliczeń o wysokiej wydajności.

 6
Author: Thirler,
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
2010-02-08 09:51:05

Chociaż nie używałem Sam Stackless, używałem Greenlet do implementacji wysoce współbieżnych aplikacji sieciowych. Niektóre z przypadków zastosowania Linden Lab postawił to: wysokowydajne inteligentne proxy, szybki system do dystrybucji poleceń na ogromnej liczbie maszyn, i aplikacja, która robi mnóstwo zapisów i odczytów w bazie danych (w stosunku około 1: 2, który jest bardzo ciężki do zapisu, więc spędza większość swojego czasu czekając na powrót bazy danych), i web-crawler-rodzaj rzeczy do wewnętrznych danych internetowych. Zasadniczo każda aplikacja, która spodziewa się, że będzie musiała wykonać wiele wejść/wyjść sieciowych, skorzysta z możliwości stworzenia miliarda lekkich wątków. 10,000 połączonych klientów nie wydaje mi się wielką sprawą.

Stackless lub Greenlet nie są tak naprawdę kompletnym rozwiązaniem. Są bardzo niskopoziomowe i będziesz musiał zrobić wiele monkeywork, aby zbudować z nimi aplikację, która wykorzystuje je w pełni. Wiem to, bo utrzymuj bibliotekę, która zapewnia warstwę sieci i planowania na Greenlet, zwłaszcza dlatego, że pisanie aplikacji jest o wiele łatwiejsze. Jest ich teraz kilka; utrzymuję Eventlet, ale jest też Conjurence, Chiral, i prawdopodobnie kilka innych, o których Nie wiem.

Jeśli rodzaj aplikacji, którą chcesz napisać brzmi jak to, o czym pisałem, rozważ jedną z tych bibliotek. Wybór Stackless vs Greenlet jest nieco mniej ważny niż decyzja, która biblioteka najlepiej pasuje do potrzeb tego, co chcesz zrobić.

 6
Author: rdw,
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
2010-02-17 07:50:37

Podstawową użytecznością dla zielonych wątków, tak jak ja to widzę, jest zaimplementowanie systemu, w którym masz dużą ilość obiektów, które wykonują operacje z dużym opóźnieniem. Przykładem może być komunikacja z innymi maszynami:

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

Wątki pozwalają pisać powyższy kod naturalnie, ale jeśli liczba obiektów jest wystarczająco duża, wątki po prostu nie mogą działać prawidłowo. Ale możesz użyć zielonych nici nawet w naprawdę dużych ilościach. request_information() powyżej może się przełączyć na jakiś scheduler gdzie inne prace czekają i wrócić później. Otrzymujesz wszystkie korzyści z możliwości wywoływania funkcji blokujących tak, jakby natychmiast powróciły bez użycia wątków.

Jest to oczywiście bardzo przydatne dla każdego rodzaju obliczeń rozproszonych, jeśli chcesz pisać kod w prosty sposób.

Interesujące jest również, aby wiele rdzeni łagodziło oczekiwanie na blokady:

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

Funkcja green_lock w zasadzie próbowałaby zdobyć blokadę i po prostu przełączyć się na główny scheduler, jeśli zawiedzie z powodu innych rdzeni korzystających z obiektu.

Ponownie, zielone wątki są używane do łagodzenia blokowania, umożliwiając pisanie kodu w sposób naturalny i nadal działa dobrze.

 5
Author: porgarmingduod,
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
2010-02-16 20:59:54