2013-03-08 10 views
5

Ho preso il codice di esempio da Unterstanding eventlet.wsgi.server.È un greenthread uguale a un thread "reale"

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) 

Quando accedo al server Web tramite diversi indirizzi IP client, posso vedere che vengono elaborati in parallelo. E con la stampa in hello_world, posso anche che vengano elaborati in due greenthread diversi ma nello stesso thread del sistema operativo.

Sono nuovo di Python. Sono curioso che se ogni greenthread si lega a un thread OS sottostante?

+0

fili verdi non si basano su alcun nativo Funzionalità del sistema operativo e vengono gestite nello spazio utente anziché nello spazio del kernel – Chipmunk

risposta

5

Ogni thread verde è collegato esattamente a un thread Python collegato esattamente a un thread del sistema operativo. In teoria, Eventlet poteva distribuire thread verdi su più thread Python e, di conseguenza, thread del sistema operativo, ma questo è un lavoro molto vantaggioso poiché il codice Python non viene eseguito in parallelo su CPython [1].

Regola empirica: se si desidera utilizzare più core, scegliere un'altra lingua con Python, la soluzione migliore è eseguire diversi processi. Il modo rapido è multiprocessing [2] (in stdlib dal 2.6), il modo efficace è os.fork [3] [4] manualmente.

Solo un piccolo chiarimento sulla terminologia: Per i sistemi operativi più diffusi, l'unico modo per eseguire codice in parallelo è quello di avere più thread del sistema operativo. In senso stretto, le vostre richieste vengono elaborate non in parallelo ma simultaneamente; precisamente perché c'è solo un thread del sistema operativo. In qualsiasi momento, c'è solo un thread verde che esegue un codice. Per inciso, la stessa restrizione si applica ai normali thread Python, ecco perché Eventlet (o altre librerie di thread verdi) funzionano solo come rimpiazzo drop-in e (soprattutto) non causano nuovi bug insoliti.

È possibile trovare questa risposta utile: 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