greenlet switch原理猜測

2021-06-22 09:04:37 字數 494 閱讀 5051

其實說是greenlet之間跳轉執行,根本應該是generator之間的跳轉執行。那麼它們之間跳轉執行,是怎麼進行上下文轉換的呢?

下面為猜想啊:

每個generator都包含下面資訊

original_esp 存放執行next()之前esp的,用於從generator返回時,恢復原來esp指。

stack 棧,初始化的generator為空,跳入generator執行時,會存放呼叫函式的環境,它的作用可以想象為與程序的棧作用一樣。

pause_esp 當generator暫停執行時,存放暫停之前的esp值,這樣當generator恢復執行時,將esp暫存器設為該指,即可快速恢復generator執行壞境。

eax 暫存器可用於在generator之間傳遞返回值。

糾正:原本以為python協程都是用generator實現的,看了greenlet後,發現不是。greenlet是直接通過c實現的,以模組的形式載入進python直譯器。不過原理跟上面解釋的應該差不多。

原環套原環

今天在除錯兄弟的程式的時候發現了乙個問題,就是在組合資料的時候,有些時候可以成功,有些時候失敗,感覺十分奇怪。功能大概是這樣的,就是在一棵樹上掛資料,所有的節點都可以有資料,不只是葉子的,在組合資料的時候,可以從任意節點取資料,但是不能是重複的資料。資料可能出現的情況如圖a b c所示,圖a是沒有干...

MongoDB writeConcern原理解析

mongodb支援客戶端靈活配置寫入策略 writeconcern 以滿足不同場景的需求。db.collection.insert mongodb支援的writeconncern選項如下 w 資料寫入到number個節點才向用客戶端確認 j 寫入操作的journal持久化後才向客戶端確認 wtime...

LinkedBlockingQueue原理分析

linkedblockingqueue也是乙個阻塞佇列,相比於arrayblockingqueue,他的底層是使用鍊錶實現的,而且是乙個可有界可無界的佇列,在生產和消費的時候使用了兩把鎖,提高併發,是乙個高效的阻塞佇列,下面就分析一下這個佇列的原始碼。鍊錶節點定義 static class node...