2013-03-08 23 views
5

Pobrałem przykładowy kod z Unterstanding eventlet.wsgi.server.Czy greenthread jest równy "prawdziwemu" wątkowi

from eventlet import wsgi 
import eventlet 
from eventlet.green import time 
import threading 

def hello_world(env, start_response): 
    print "got request", eventlet.greenthread.getcurrent(), threading.currentThread() 
    time.sleep(10) 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return ['Hello, World!\n'] 

wsgi.server(eventlet.listen(('', 8090)), hello_world) 

Po uzyskaniu dostępu do serwera internetowego za pośrednictwem różnych adresów IP klienta widzę, że są przetwarzane równolegle. I z wydrukiem w hello_world, mogę również, że są one przetwarzane w dwóch różnych greenthreads, ale w tym samym wątku systemu operacyjnego.

Jestem nowy w Pythonie. Jestem ciekawy, że jeśli każdy greenthread wiąże się z podstawowym wątkiem systemu operacyjnego?

+0

Zielone nitki nie opiera się na żadnych rodzimy Funkcje systemu operacyjnego i są zarządzane w przestrzeni użytkownika zamiast w przestrzeni jądra – Chipmunk

Odpowiedz

5

Każda zielona nić jest powiązana z dokładnie jednym wątkiem Python, który jest związany z dokładnie jednym wątkiem systemu operacyjnego. Teoretycznie Eventlet może dystrybuować zielone wątki w wielu wątkach Pythona, aw konsekwencji w wątkach systemu operacyjnego, ale to bardzo dużo pracy z bardzo niewielkimi korzyściami, ponieważ kod Pythona nie jest wykonywany równolegle w CPython [1].

Praktyczna zasada: jeśli chcesz używać wielu rdzeni, wybierz inny język z Pythonem najlepiej jest uruchomić kilka procesów. Szybka droga to multiprocessing [2] (w trybie standardowym od wersji 2.6), solidnym sposobem jest ręczna zmiana wartości os.fork [3] [4].

Wystarczy trochę wyjaśnienia na temat terminologii: W przypadku najpopularniejszych systemów operacyjnych, jedynym sposobem wykonania kodu równolegle jest posiadanie wielu wątków systemu operacyjnego. Ściśle mówiąc, twoje wnioski są przetwarzane nie równolegle, ale jednocześnie; właśnie dlatego, że istnieje tylko jeden wątek systemu operacyjnego. W danym momencie jest tylko jeden zielony wątek wykonujący jakiś kod. Nawiasem mówiąc, to samo ograniczenie dotyczy zwykłych wątków Pythona, dlatego Eventlet (lub inne biblioteki z zielonymi wątkami) działają głównie jako zamienniki typu drop-in i (głównie) nie powodują żadnych nowych nietypowych błędów.

Można znaleźć tę odpowiedź za przydatne: https://stackoverflow.com/posts/14227272/revisions

[1] http://wiki.python.org/moin/GlobalInterpreterLock
[2] http://docs.python.org/2/library/multiprocessing.html
[3] http://docs.python.org/2/library/os.html#os.fork
[4] https://github.com/jonashaag/bjoern/blob/master/tests/fork.py