什么是orchid?
orchid是一個(gè)構(gòu)建于強(qiáng)大的boost庫基礎(chǔ)上的C++庫,類似于python下的gevent/eventlet,為用戶提供基于協(xié)程的并發(fā)模型。
什么是協(xié)程:
協(xié)程,顧名思義,協(xié)作式程序,其思想是,一系列互相依賴的協(xié)程間依次使用CPU,每次只有一個(gè)協(xié)程工作,而其他協(xié)程處于休眠狀態(tài)。協(xié)程在控制離開時(shí)暫停執(zhí)行,當(dāng)控制再次進(jìn)入時(shí)只能從離開的位置繼續(xù)執(zhí)行。 協(xié)程已經(jīng)被證明是一種非常有用的程序組件,不僅被python、lua、ruby等腳本語言廣泛采用,而且被新一代面向多核的編程語言如golang rust-lang等采用作為并發(fā)的基本單位。
協(xié)程可以被認(rèn)為是一種用戶空間線程,與傳統(tǒng)的搶占式線程相比,有2個(gè)主要的優(yōu)點(diǎn):
- 與線程不同,協(xié)程是自己主動(dòng)讓出CPU,并交付他期望的下一個(gè)協(xié)程運(yùn)行,而不是在任何時(shí)候都有可能被系統(tǒng)調(diào)度打斷。因此協(xié)程的使用更加清晰易懂,并且多數(shù)情況下不需要鎖機(jī)制。
- 與線程相比,協(xié)程的切換由程序控制,發(fā)生在用戶空間而非內(nèi)核空間,因此切換的代價(jià)非常的小。
green化
術(shù)語“green化”來自于python下著名的協(xié)程庫greenlet,指改造IO對(duì)象以能和協(xié)程配合。某種意義上,協(xié)程與線程的關(guān)系類似與線程與進(jìn)程的關(guān)系,多個(gè)協(xié)程會(huì)在同一個(gè)線程的上下文之中運(yùn)行。因此,當(dāng)出現(xiàn)IO操作的時(shí)候,為了能夠與協(xié)程相互配合,只阻塞當(dāng)前協(xié)程而非整個(gè)線程,需要將io對(duì)象“green化”。目前orchid提供的green化的io對(duì)象包括:
- tcp socket(還不支持udp)
- descriptor(目前僅支持非文件類型文件描述符,如管道和標(biāo)準(zhǔn)輸入/輸出,文件類型的支持會(huì)在以后版本添加)
- timer (定時(shí)器)
- signal (信號(hào))
chan:協(xié)程間通信
chan這個(gè)概念引用自golang的chan。每個(gè)協(xié)程是一個(gè)獨(dú)立的執(zhí)行單元,為了能夠方便協(xié)程之間的通信/同步,orchid提供了chan這種機(jī)制。chan本質(zhì)上是一個(gè)阻塞消息隊(duì)列,后面我們將看到,chan不僅可以用于同一個(gè)調(diào)度器上的協(xié)程之間的通信,而且可以用于不同調(diào)度器上的協(xié)程之間的通信。
多核
建議使用的scheduler per cpu的的模型來支持多核的機(jī)器,即為每個(gè)CPU核心分配一個(gè)調(diào)度器,有多少核心就創(chuàng)建多少個(gè)調(diào)度器。不同調(diào)度器的協(xié)程之間也可以通過chan來通信。協(xié)程應(yīng)該被創(chuàng)建在哪個(gè)調(diào)度器里由用戶自己決定。
進(jìn)一步信息請閱讀doc目錄下tutorial。如果您發(fā)現(xiàn)任何bug或者有任何改進(jìn)意見,請聯(lián)系 ioriiod0@gmail.com
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

