協程這個東西有一段時間非常火熱,特別是go出來以後,大家都覺得這個使用者態執行緒技術解決了很多問題,甚至用它可以支撐8億使用者,於是大家紛紛寫了c/c++的協程庫。實際上,我覺得協程庫和支撐多少使用者關係不大,甚至不用協程還可以支撐更多的使用者(減少了協程的開銷),協程只是提供一種程式設計模式,讓伺服器程式寫起來感覺輕鬆一些。
我們這個協程庫,首先它只是乙個玩具,我也沒有把它用在生產環境中(如果要用我會直接用go),寫這個協程庫純粹是為了學習。
其次,這個庫脫胎於雲風的協程庫,不過雲風的協程庫更像乙個玩具,如果你想知道協程應該怎麼實現,看看這個入門是很不錯的,**非常簡潔。但這個庫也有這些缺點:
我fork過來的修改版在這裡,**改得比較多,這份實現邏輯上更加接近於lua的協程庫:
沒有使用共享棧的方式,我的考慮是這樣的:
**量不多,我直接貼在這時,也可以到github上去取:
// coroutine.h
實現
// coroutine.c
int
結果如下,我的虛擬機器cpu是雙核intel(r) xeon(r) cpu e5-2680 v3 @ 2.50ghz
# 第一次建立10000個協程
create time=0.053979s
# 切換200w次協程
swap time=0.883039s
# 第二次建立10000個協程
create time2=0.005390s
這樣的效能表現是否能滿足要求呢。
再一次宣告這個協程庫不保證沒有bug,雖然我寫了幾個測試函式驗證過,如果要用在生產環境中,請仔細閱讀**。
我們後面也許可以自己寫乙個swapcontext函式來代替ucontext。
gevent實現協程
1 yield實現 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield def main t1 task 1 建立迭代器 t...
coroutine php PHP 協程實現
多程序 執行緒 最早的伺服器端程式都是通過多程序 多執行緒來解決併發io的問題。程序模型出現的最早,從unix 系統誕生就開始有了程序的概念。最早的伺服器端程式一般都是 accept 乙個客戶端連線就建立乙個程序,然後子程序進入迴圈同步阻塞地與客戶端連線進行互動,收發處理資料。多執行緒模式出現要晚一...
coroutine php PHP 協程實現
多程序 執行緒 最早的伺服器端程式都是通過多程序 多執行緒來解決併發io的問題。程序模型出現的最早,從unix 系統誕生就開始有了程序的概念。最早的伺服器端程式一般都是 accept 乙個客戶端連線就建立乙個程序,然後子程序進入迴圈同步阻塞地與客戶端連線進行互動,收發處理資料。多執行緒模式出現要晚一...