Zielone kropki zapewniają współbieżność, ale nie są równoległe względem. Współbieżność ma miejsce, gdy kod może działać niezależnie od innego kodu. Równoległość jest jednoczesnym wykonywaniem współbieżnego kodu. Równoległość jest szczególnie użyteczna, gdy jest dużo pracy do wykonania w przestrzeni użytkownika, a to zwykle jest praca z dużą ilością procesorów. Współbieżność przydaje się do rozwiązywania problemów, umożliwiając równoległe planowanie i zarządzanie różnymi częściami.
Zielone lasy naprawdę świecą w programowaniu sieciowym, gdzie interakcje z jednym gniazdem mogą odbywać się niezależnie od interakcji z innymi gniazdami. Jest to klasyczny przykład współbieżności. Ponieważ każda greenlet działa we własnym kontekście, możesz nadal korzystać z synchronicznych interfejsów API bez nawlekania. Jest to dobre, ponieważ wątki są bardzo drogie pod względem pamięci wirtualnej i narzutów jądra, więc współbieżność, którą można osiągnąć za pomocą wątków, jest znacznie mniejsza. Dodatkowo, wątki w Pythonie są droższe i bardziej ograniczone niż zwykle dzięki GIL. Alternatywą dla współbieżności są zwykle projekty takie jak Twisted, libevent, libuv, node.js itd., Gdzie cały kod dzieli ten sam kontekst wykonania i rejestrują funkcje obsługi zdarzeń.
To doskonały pomysł, aby używać proxy (z odpowiednim wsparciem sieciowym, np. Poprzez gevent) do pisania proxy, ponieważ obsługa żądań może być wykonywana niezależnie i powinna być napisana jako taka.
Zieleniele zapewniają współbieżność z powodów podanych wcześniej. Współbieżność nie jest równoległością. Ukrywając rejestrację zdarzeń i wykonując dla ciebie harmonogramy połączeń, które normalnie blokują bieżący wątek, projekty takie jak gevent wystawiają tę współbieżność bez potrzeby zmiany na asynchroniczny interfejs API, a przy znacznie mniejszych kosztach dla twojego systemu.
@Imran Chodzi o Green thread w Javie. Moje pytanie dotyczy zieleni w Pythonie. Czy czegoś brakuje? – Rsh
Afaik, wątki w pythonie tak naprawdę nie są współbieżne ze względu na globalną blokadę interpretera. Sprowadzałoby się to do porównywania kosztów obu rozwiązań. Chociaż rozumiem, że istnieje kilka implementacji Pythona, więc może nie dotyczyć ich wszystkich. – didierc
@didierc CPython (i PyPy od teraz) nie interpretuje kodu Pythona (bajt) * równolegle * (czyli fizycznie w tym samym czasie na dwóch różnych rdzeniach procesora). Jednak nie wszystko, co robi program Pythona jest pod GIL (typowe przykłady to syscalls, w tym funkcje we/wy i C, które celowo uwalniają GIL), a 'threading.Thread' jest tak naprawdę wątkiem systemu operacyjnego z wszystkimi konsekwencjami. To naprawdę nie jest takie proste. Nawiasem mówiąc, Jython nie ma GIL AFAIK i PyPy też próbuje się go pozbyć. – delnan