該模塊實現 eventlet 中的 “綠色線程” 即協程。
目錄
一、模塊級函數
sleep()
spawn()
模塊級函數
eventlet.greenthread.sleep(seconds=0)
- 在至少參數 seconds 秒后讓出控制權,參數 seconds 可以是一個整數,也可是浮點型的。當參數 seconds 為0時,主動讓出控制權,在執行長時間計算時這么做有助於讓別的協程也得到執行。
- eventlet.greenthread.spawn(func, *args, **kwargs)
- 孵化(創建)一個可以調用 func(*args, **kwargs) 的協程,返回一個 GreenThread 對象,可以使用該對象獲得調用 func(*args, **kwargs) 的返回值。
- 這條指令執行后控制權立即返回給調用這個接口的函數,創建的協程只是有了調用 func(*args, **kwargs) 的能力,而不是這里一孵化,協程就會立刻調用 func(*args, **kwargs)。 spawn_after() 可以指定在一定時間后孵化一個協程。
- eventlet.greenthread.spawn_n(func, *args, **kwargs)
-
孵化(創建)一個可以調用
func(*args, **kwargs) 的協程,這里返回的協程不能獲取 func(*args, **kwargs) 的返回值或者拋出的異常,比
spawn() 更快,當沒有關鍵字參數的時候該指令運行最快。
- 如果函數拋出一個異常,spawn_n 會打印堆棧軌跡,可以通過 eventlet.debug.hub_exceptions() 將這個功能關閉。
- eventlet.greenthread.spawn_after(seconds, func, *args, **kwargs)
- 參數 seconds 秒后孵化一個可以調用 func 的協程。返回一個 GreenThread 對象,可以用來獲取調用 func 的返回值。
- eventlet.greenthread.spawn_after_local(seconds, func, *args, **kwargs)
- seconds 秒后孵化協程,如果當前的協程退出,那么函數不會被調用。 seconds 可以是整數或者浮點數,參數 func 會在自己所在的協程中執行,傳給它的參數正好是 args 和 kwargs。
-
返回一個 GreenThread 對象,可以獲取 func 的返回值。
- GreenThread 對象
- class eventlet.greenthread.GreenThread(parent)
- GreenThread 類是 Greenlet 的子類,添加了能夠獲取主函數返回值的功能,不要直接構造 GreenThread 對象,而是用 spawn() 函數來孵化一個新的協程!
- cancel(*throw_args)
- 如果這個協程還沒有運行,等價於殺掉它,如果這個協程已經運行了,這里會等待它運行完,然后殺掉它。一旦調用過這個函數,所有的 wait() 調用都會拋出異常 throw_args (默認為 greenlet.GreenletExit )。
- kill(*throw_args)
- 強制殺掉協程,就算協程里面的函數已經運行了也要殺掉它。一旦調用過這個函數,所有的 wait() 調用都會拋出異常 throw_args (默認為 greenlet.GreenletExit)。
- link(func, *curried_args, **curried_kwargs)
- 建立一個函數 func ,這個函數會以當前協程的結果為參數調用。
- 函數 func 應該有以下這種簽名:
def func(gt, [curried args/kwargs]):
- 當協程運行完成后,它會立刻調用 func ,將自己和 curried arguments 一起傳遞給 func 。如果 func 想要獲取協程的返回值,就應該調用第一個參數,也就是調用自己的那個協程的 wait() 方法。
-
func 以調用自己的協程的上下文運行,所以有可能會干擾其他被連接的函數,比如通過顯式切換到其他的協程。
- unlink(func, *curried_args, **curried_kwargs)
- 移除 link() 函數設置的連接,如果成功返回 True ,否則返回 False。
- wait()
- 返回當前協程中主函數的執行結果,如果是一般的執行結果,wait() 會返回它;如果是異常,wait() 會拋出同樣的異常(但是堆棧軌跡不可避免的包含一些協程模塊中的幀)。