eventlet學習筆記

2022-09-04 07:21:14 字數 2729 閱讀 6169

標籤(空格分隔): python eventlet

eventlet是乙個用來處理和網路相關的python庫函式,且可以通過協程(coroutines)實現併發。在eventlet裡,將協程叫做greenthread(綠色執行緒),所謂併發,即開啟多個greenthread,並對這些greenthread進行管理。尤為方便的是,eventlet為了實現「綠色執行緒」,竟然對python的和網路相關的幾個標準庫函式進行了改寫,並且可以以補丁(patch)的方式匯入到程式中,因為python的庫函式只支援普通的執行緒,而不支援協程,eventlet稱之為「綠化」。

eventlet主要基於兩個庫——greenlet(過程化其併發基礎,簡單封裝後即成為greentread)和select.epoll(預設網路通訊模型)。

greenlet支援微執行緒(tasklet),tasklet偽併發執行,同步在通道上交換資料。

greenlet——coroutines(協程)——micro-thread(微執行緒)(三者意思相近)

在greenlet上可自定義微執行緒排程順序,靈活掌控控制流。

greenlet之間可相互切換,當乙個greenlet1切換至greenlet2時,greenlet1掛起,當greenlet2執行一段時候切換回時,greenlet2掛起,greenlet1恢復執行。

每個greenlet建立時擁有乙個空的棧,當切換至該greenlet時,它會執行乙個特殊函式(該函式也許會呼叫其它函式),當最終最外層函式執行完成後,greenlet棧再次為空,greenlet死亡。greenlet也可被不可捕捉的異常殺死。

每乙個greenlet有乙個父greenlet,相應父greenlet在greenlet被建立時初始化。greenlet死亡後,父greenlet繼續執行。

greenlet樹形組織,隱含的main greenlet為此樹根節點。任何乙個greenlet死亡,執行順序將被回溯至main greenlet。異常發生將傳播至parent greenlet。

switch不是呼叫,只是在並行的'stack containers'中傳輸執行。

greenlet(run=none, parent=none)

建立乙個新的greenlet物件但並不執行,run為可呼叫請求,parent為父greenlet,預設為當前greenlet。

greenlet.getcurrent()

返回當前greenlet。

greenlet.greenletexit

此特殊異常不會傳播至父greenlet,它被用於殺死乙個單獨的greenlet。

greenlet切換發生在switch()函式被呼叫或乙個greenlet死亡時。呼叫switch

()函式的greenlet為切換至的目標greenlet;greenlet死亡時切換至parent greenlet。切換時,乙個物件或異常傳送至目標greenlet,這即是greenlets間方便的通訊方式。例如:

def test1(x, y):

z = gr2.switch(x+y)

print z

def test2(u):

print u

gr1.switch(42)

gr1 = greenlet(test1)

gr2 = greenlet(test2)

gr1.switch("hello", " world")

此段程式輸出「hello world」和42.需注意test1()和test2()的引數並不是在greenlet建立時給出,而是在第一次切換到相應greenlet時給出。

g.switch(*args, **kwargs)

切換至greenlet g執行。

需要注意的是x = g.switch(y),會將物件y傳送給g,然而稍後卻有可能將毫無關聯的物件經毫無關聯的greenlet處理後返回給x。這可以理解為g.switch(y)的值沒有立即返回,而其它greenlet的結果卻先返回了!!!

switch至乙個已經死亡的greenlet,最終將會switch至其parent greenlet或parent' parent greenlet,如此回溯。(最終的parent greenlet是main greenlet,永不死亡。)

g.switch(*args, **kwargs)

切換至greenlet g執行。

g.run

執行後執行greenlet g,g執行後該屬性不再存在。

g.parent

g的parent greenlet。該變數可寫,但禁止構造迴圈型父子關係。

g.gr_frame

目前上層框架,或為none。

g.dead

當g死亡時值為true。

bool(g)

g處於活動狀態時值為true,若死亡或還未開始值為false。

g.throw([typ, [val, [tb]]])

切換執行序列至greenlet g,在g中立即丟擲給定異常。若未提供引數,異常預設為greenlet.greenletexit。

greenlet能夠和python執行緒結合,每個python執行緒中包含乙個獨立的main greenlet及由其子greenlet構成的樹。但不屬於同乙個執行緒的不同greenlet之間不能結合或切換。

eventlet學習筆記之一 基本概念

如果這是您第一次使用eventlet,您可能會發現設計模式文件中的示例是乙個很好的起點。eventlet是圍繞綠色執行緒 即協程,我們使用術語可互換 的概念構建的,這些概念是為了進行與網路相關的工作而啟動的。綠色執行緒與正常執行緒的區別主要有兩種 eventlet.spawn func,args,k...

eventlet引發的學習 python GIL

python gil官方wiki python gil 系列之通過例項認識python的gil gil globalinterpreterlock,是cpython中用來防止多執行緒同時執行同乙個python位元組碼的互斥鎖。由於cpython中的執行緒是不安全的,所以cpython必須需要使用gi...

eventlet做wsgi伺服器的例子

eventlet做wsgi伺服器的例子 from eventlet import api,wsgi start response 200 ok content type text plain return hello world 同理可以用這種方式來啟動其他wsgi介面的伺服器。穩定性未知。預設情況...