2013-03-08 51 views
5

我從Unterstanding eventlet.wsgi.server獲取了示例代碼。是等於「真實」線程的綠色線程

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) 

當我通過不同的客戶端IP地址訪問Web服務器時,我可以看到它們並行處理。在hello_world的打印中,我也可以在兩個不同的greenthreads中處理它們,但是在同一個OS線程中。

我是Python新手。我很好奇,如果每個綠色線程都連接到底層的OS線程?

+0

綠色線程不依賴於任何本地操作系統功能,它們在用戶空間而不是內核空間中進行管理 – Chipmunk 2013-03-08 05:43:42

回答

5

每個綠色線程只與一個Python線程綁定,該線程恰好與一個OS線程綁定。從理論上講,Eventlet可以在多個Python線程中分配綠色線程,因此可以在OS線程中分配綠色線程,但由於Python代碼不能在CPython [1]上並行執行,所以這對於很少的好處很有用。經驗法則:如果你想使用多核心,用Python選擇其他語言你最好的選擇是運行多個進程。快速的方法是multiprocessing [2](自2.6開始在stdlib中),可靠的方法是os.fork [3] [4]手動。

只是一點點澄清術語: 對於最流行的操作系統,並行執行代碼的唯一方法是讓多個操作系統線程。嚴格地說,你的請求不是並行處理,而是並行處理;正因爲只有一個操作系統線程。在任何時候,只有一個綠色線程執行一些代碼。順便說一句,同樣的限制適用於常規Python線程,這就是爲什麼Eventlet(或其他綠色線程庫)大部分只是作爲插入替換工具,並且(大部分)不會導致任何新的異常錯誤。

你會發現這個答案有用: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