
2015-08-08 |&n®©÷∏bsp; 發布者:梁國(guó)芳&n± "↕bsp; | ↑✔≤∏ 查看(kàn):3320次
IT新聞我們還(hái)精心制(zhì)作(zuò)了(le) ☆ε∏©;Rust 開(kāi)發技(jì)術(sh±→ù)學習(xí)路(lù)線,滿滿的(de)都(dōu)是(shì)幹貨。
與此同時(shí),我們也(yě)還(hái)邀請(←✔qǐng)了(le)圈內(nèi)知(zhī)名的(de)Rust資深使用(y∞$£òng)者Elton,他(tā)畢業(yè)于香港大(dà)學計(≥≈ ✘jì)算(suàn)機(jī)系畢業(yè),現(x"$ ÷iàn)為(wèi)微(wēi)信遊戲開(kāi←♠€)發組工(gōng)程師(shī),負責微(wēi)信σ±遊戲中心後台開(kāi)發,遊戲推薦系統開(αkāi)發。Elton将帶你(nǐ)全面認識他(tā)自(zì)主開(kāi)π≠發的(de)協程庫,Rust進階者不(bù)容錯(cuò)過≠•>哦。趕緊點擊下(xià)面的(de)鏈接報(bào)名吧(ba)!
【Rust技(jì)術(shù)公開(kāi)課✘¥】港哥(gē)Elton自(zì)主開(kāi)發的(de)協程庫解£析
本期微(wēi)信群的(de)分(fēn)♦☆↓享情況如(rú)下(xià):

王川( GitHub、 LinkedIn),水(shuǐ)泊梁山(shān)人(rén)≥×≥≥,玫瑰星雲創始人(rén),大(dà)學之前寫各種 BASI♥÷C。2007 年(nián)畢業(yè)于青島大(dà)學計(j ÷★©ì)算(suàn)機(jī)專業(yè),随後來(lΩ÷★ái)到(dào)北(běi)京工(gōng)作(zuò∞✔↑ ),從(cóng)事(shì) Python 開(kāi)發 6 ≤¶♦年(nián)多(duō),先後任職于 Exowe≥•↑b、Happylatte,高(gāo)級軟件(jiàn)工(gōng)程 ♣©•師(shī)。2013 年(nián)投入手遊創業(₽↕yè)中,作(zuò)為(wèi) CTO 帶領團隊完∏λ♠成了(le)基于 Python 的(de)産品後端,及基于 Unity 3D $£的(de)産品前端。期間(jiān),不(bù)斷地(dì)研究高(↔★∏→gāo)并發可(kě)伸縮的(de)服務器(qì)設計(jì),≠β♠π應用(yòng)于 Web、雲計(jì)算(suàn)α★©&和(hé)遊戲後端等。另外(wài),他(tā)也(yě)熱≠¥×(rè)衷于開(kāi)源事(shì)業(yè),北(běi)京 Linuxεγ 用(yòng)戶組成員(yuán),活躍于各種社區(qū)和(hé)線下(x¥•×γià)聚會(huì)上(shàng),參與或創↓¥÷ 立了(le)許多(duō)開(kāi)源項目。
CSDN:請(qǐng)和(hé)大(dà)家(jiā)介紹下¥★βφ(xià)你(nǐ)和(hé)目前所從(cóng)事(shì)的λ(de)工(gōng)作(zuò)。
王川:我是(shì)一(yī)個(gè) Python 程序員(δ<yuán)(呵呵),從(cóng)小(x≈↔iǎo)折騰小(xiǎo)霸王 BASIC 的(de)那(nà)種,通(tōn♦βε£g)過 Java 和(hé) FreeBSD 接觸到(dà>∑÷εo)開(kāi)源社區(qū),後來(lái)主要(yào)在搞一(yī)些(₩↑↔↔xiē) Python 和(hé) ArcλαδhLinux 的(de)項目。工(gōng) ¶≈作(zuò)上(shàng)前 5 年(nián)在打∏↓工(gōng),最近(jìn) 3 年(nián)在瞎折騰,做(zu<σò)過手遊、各種外(wài)包、礦池理(lǐ)财什(shén)麽的(de),但§££(dàn)很(hěn)明(míng)顯還(hái)沒有(yǒu)折騰出個(α$gè)所以然。
目前在跟幾個(gè)合夥人(rén)創業(yè)做(z噣uò)一(yī)個(gè)叫“優定”的(de)産品,一(yī)個(gè)豪車(chē)線下(xi&✔€à)社交的(de)App,豪車(chē)車(chē)主和(h♥¥é)高(gāo)顔值女(nǚ)性可(kěσ"εΩ)以在優定App上(shàng)有(yǒu)償匹配到(dào)<≤α對(duì)方,優定App會(huì)引導完成一(↑"π₩yī)次完美(měi)的(de)線下(xià)社交之旅。
優定将于近(jìn)日(rì)登陸 iOS 平台,敬請(qǐn ↑ ↓g)關注!我們也(yě)在尋找投資機(jī)會(huì),您若有(yǒu)δπ©意向請(qǐng)在完成 20 次優定匹配後,在應用¶₹≥(yòng)內(nèi)撥打 404 洽≈♠→γ詢。
CSDN:你(nǐ)是(shì)一(yī)位連續的(de)Ω$∑技(jì)術(shù)人(rén)員(yuán)創業(yè)者,能(néng)♣"☆否談下(xià)曆次的(de)創業(yè)項目,以及有(yǒu)什(®₩shén)麽心得(de)和(hé)體(tǐ)會(huì)。
王川:連續談不(bù)上(shàng),其實也(yě)©λ∑就(jiù)兩三次,13 年(nián)做(zuò)手遊沒趕上(sh≥✘£←àng)最好(hǎo)的(de)時(shí)候,14÷ 年(nián)過渡期算(suàn)是(shì)幫朋(péng)友(yǒδ£u)做(zuò)過一(yī)些(xiē)七七八八的(₹§de)項目,今年(nián)就(jiù)是(shì)做(zuò)優定。感₹✔受最深的(de)就(jiù)是(shì)合夥人(rén)的(±↑de)重要(yào)性,當然這(zhè)在一(yī)定程度上(shàng)聽γ (tīng)上(shàng)去(qù)與“緻富的(de★→☆)道(dào)路(lù)上(shàng)有(yǒu)個(gè)富爹非常→&→δ重要(yào)”類似的(de)然并卵,但(dàπβ¥n)當能(néng)力和(hé)資源有(yσ★>ǒu)短(duǎn)闆時(shí)能(néng)碰到(dào)幾個(gè)三觀≥€>&相(xiàng)似目标相(xiàng)同能(néng)力互補的(de)♥₩♦β合夥人(rén)也(yě)是(shì)非§φ常幸運的(de)。除此,共同擁有(yǒu)一(yī)個(gè)堅定∑→ε的(de)目标也(yě)是(shì)至關重要★(yào)的(de),一(yī)切手段皆要(yào)奔₽'∞≤著(zhe)這(zhè)個(gè)目的(de)去(qù)。§α÷₹
CSDN:業(yè)內(nèi)有(yǒu)人(rε★↕>én)說(shuō)「技(jì)術(shù)人(γ≈→∑rén)員(yuán)并不(bù)适合創業(yè)」,對(d♦uì)此你(nǐ)怎麽看(kàn)?技(jì)術(α±↕shù)人(rén)員(yuán)創業(yè)要(Ω₽✘yào)具備哪些(xiē)品質?
王川:也(yě)許這(zhè)個(gè)概念是(shì)說(shuō),技(jì↔÷₹)術(shù)人(rén)員(yuán)并不(bù)适合在創業α''<(yè)中以技(jì)術(shù)思維去(qù)解決自(zìΩ®)己并不(bù)擅長(cháng)的(de)事(shì)情,不(bù)過™≥ 我覺得(de)這(zhè)兩個(gè)條件(jiàn):A ✔ε™Ω技(jì)術(shù)思維 B 不(bù)擅長∞σ↑(cháng) 是(shì) and 的(de)關系φ↓——當然這(zhè)>>±÷個(gè)想法也(yě)是(shì)有(yǒu)技(jì)術(δ↕shù)思維風(fēng)險的(de)——單σ§獨不(bù)擅長(cháng)沒關系,技(jì)術(shù)¥思維有(yǒu)時(shí)也(yě)好(hǎo)♦←★事(shì),比如(rú)窮盡各種 corner c£§ase 規避風(fēng)險、對(duì)複雜(z↕ ¥á)問(wèn)題的(de)概括抽象等,但(dà♠≥'®n)在不(bù)擅長(cháng)的(de)事(shì)情上(shàn↔®©₹g)照(zhào)搬技(jì)術(shù)思維就(jiù)可(k£"∞ě)能(néng)會(huì)出 bug。比如(rú&×↓≥)說(shuō)産品臨上(shàng)線≤'•×,忽然看(kàn)到(dào)一(yī)處體(tǐ)驗缺陷,雖然隻影(yǐn♦≠g)響少(shǎo)數(shù)用(yòng)戶,但(dàn)碰到(dào)•∑δ問(wèn)題的(de)用(yòng)戶多(du≠÷ō)半會(huì)流失;這(zhè)時(shí)技(σ♠★jì)術(shù)思維給出的(de)答(dá)案多(duō)半是(shì)延期©β®α發布,連夜修問(wèn)題,因為(wèi)技(j∞±♠σì)術(shù)上(shàng)是(shì)可(kě)以修的(∏≠de),而且不(bù)修會(huì)虧錢(qián)嘛;不(bù)說©★↕δ(shuō)上(shàng)線延期對(duì)π™γ市(shì)場(chǎng)、運營或團隊的(de)影(yǐn€>•δg)響,怎麽保證修一(yī)個(gè)問(wèn)題不(bù)會 ¥(huì)弄壞東(dōng)西(xī)或帶來(l ái)更多(duō)其他(tā)問(wèδ→n)題,而一(yī)再延期?所以這(zhè)時(shí)跳(tiào)出技( ★♦jì)術(shù)思維,從(cóng)産品的(de)角度考慮或與β> 更擅長(cháng)的(de)合夥人(rén)討(tǎo)論,能(n☆♦♥éng)不(bù)能(néng)找到(dào) work aroun ₩δ'd,繞過問(wèn)題不(bù)讓用(yòng)戶碰到(dào),或者碰到(d€™≈∏ào)但(dàn)不(bù)會(huì)流失,這(zhè)樣的(de)方↔↕±案再與從(cóng)技(jì)術(shù)角度徹底解決來(lái)做(zu÷≤→♦ò)對(duì)比,哪個(gè)方案更有(yǒu)利于實現(xiàn÷α)最終目标,就(jiù)做(zuò)哪個(gè)。我覺≤δ$ 得(de)這(zhè)也(yě)許可(kě)以總結為®φ£(wèi)“做(zuò)個(gè)吃(chī)貨,做(zuò)α∑Ω個(gè)二貨”(摘自(zì)知★₹(zhī)乎 Stay hungry. Stay fooli$γ>sh)?
CSDN:你(nǐ)是(shì)如(rú)何≈'£接觸到(dào)Rust的(de)?
王川:2014 年(nián)初,課餘時(shí)間(jiān)折騰 Geve•£≈nt for Python 3 的(de)時Ω'♦(shí)候,通(tōng)過 libe>§←v、libuv 看(kàn)到(dào)了(l$φ$e)當時(shí)還(hái)在用(yòng)α libuv 的(de) Rust 語言,正巧自(zì)己也(yě)琢磨著 ¥(zhe)學一(yī)門(mén)沒有(yǒu) vm 的(d™•γe)“硬貨”語言,又(yòu)看(δ₩ ♥kàn)到(dào)了(le)賴總的(de)評價,大(dà)緻了(le)解了(le)一(yī)些(xi 'ε✘ē)之後,又(yòu)草(cǎo)草(cǎo)對(duì)比了(le)一βε(yī)下(xià) Go,感覺價值觀契合度爆表,于是(shì)★↔↓就(jiù)加了(le)關注。
CSDN:你(nǐ)認為(wèi)Rust是(shì)λ₽≥一(yī)種怎樣的(de)編程語言?
王川:從(cóng)不(bù)是(shì)說(shuō)吧(ba)。我認±¶'✔為(wèi)
綜合來(lái)看(kàn),我覺得(de) Rust 是$¶♣(shì)一(yī)門(mén)還(hái)挺值得(d≠λ♥e)試一(yī)下(xià)的(de)、有(yǒu)前途的(de)、優秀 ®的(de)編程語言。
CSDN:你(nǐ)在哪些(xiē)工(gōng)程項目中使用(yòng₹α☆÷)到(dào)了(le)Rust?
王川:工(gōng)程項目沒有(yǒu)(囧),學術(shù)項目zmq.rs算(suàn)是(shì)半個(gè)吧(®≠↑ba),因為(wèi)這(zhè)個(gè)做(zuò)到(dào)一(y→σ≥ī)半 Rust 本身(shēn)碰到(dào)了(l↕♣δe)大(dà)改動,項目本身(shēn)也(yě)需要(yào)返工↓¶¶(gōng),加上(shàng)後來(lái)自(zì)己時(sλ↕$hí)間(jiān)不(bù)夠,就(ji←♥ù)先擱在那(nà)裡(lǐ)了(le)&♥。
CSDN:對(duì)于Rust新人(rén)↑®的(de)學習(xí),你(nǐ)有(yǒu)哪些(x₩∏®iē)建議(yì)?
王川:以興趣為(wèi)導向,實踐出真知(zhī)!比如(rú φ¥§)我感興趣高(gāo)并發這(zhè)一(yī)塊兒(ér),于是(∏β±shì)進了(le)門(mén),然後一(yī↕Ω↑)遍學語法一(yī)遍折騰著(zhe)寫zmq.rs,還(hái)是(shì)非常有(yǒu)效的(de)α↕。手頭上(shàng)沒有(yǒu)現(xiàn)成想做(zu$&"ò)的(de)東(dōng)西(xī)的(de)同學可(kě)以跟 R' ust by Examples,也(yě)是(shì)很(hěφε↓εn)不(bù)錯(cuò)的(de)。另外(wΩ≥ài)泛泛的(de)建議(yì)是(shì),多(duō)多(d×☆§©uō)提高(gāo) Get Things Done 的σ←≤(de)能(néng)力,be geeky,做(zuò)個(gè)吃≥γ(chī)貨,做(zuò)個(gè)二貨。
zmq.rs是(shì)用(yòng) Rust 重新實現(xiàn)的α☆ (de) ZeroMQ 庫。ZeroMQ 是(shì)一(yī)款非主流的♠≈∑(de)消息隊列庫,但(dàn)其實是(s™±•☆hì)一(yī)個(gè)網絡并發框架,簡單來(lái)說(sh$≠uō)就(jiù)是(shì)用(yòng)同樣的(de)接口、通≥$<(tōng)過不(bù)同的(de)媒介(TCP、進程間(jiān)、進程內εε←(nèi))、套用(yòng)不(bù)同的(de)模♠'式(請(qǐng)求響應、發布訂閱、任務分(fēn)發、扇出)在多(du≈$♣ō)個(gè) socket 之間(jiān)傳遞原子(zǐ)信息數(shù) ε±據。具體(tǐ)來(lái)說(shuō)就(jiù)是(shì)這₩¥(zhè)樣:

圖是(shì)去(qù)年(nián) WOT 會(huì☆>φ<)上(shàng)的(de)演講裡(lǐ)扒出來(lái)的(de),✘☆♠大(dà)概說(shuō)明(míng)一(yī)下(xià) ZeroMQ γ♥是(shì)什(shén)麽:ZeroMQ 的(de) socket £¥≥ 本身(shēn)沒有(yǒu)什(shén£≤©∏)麽區(qū)别,都(dōu)是(shì)一(yī)個(gè)收接口 >≥$recv 一(yī)個(gè)發接口 send,隻是(☆÷shì)應用(yòng)不(bù)同的(de"')收發消息模式讓他(tā)們有(yǒu)了(le)不(bù)同的(de)類型,₩&♦比如(rú) REQ、REP、PUB、SUB 等。每個(πβ★gè) ZeroMQ socket 都(♦✔dōu)可(kě)以監聽(tīng)多(duō)個(∑≥γ±gè) endpoint——可(kě)以是(shì)一←✔₽(yī)個(gè) TCP 端口、也(yě)可(kě)以是(shì±> ↕)一(yī)個(gè) UNIX domai∞n sokcet 等,同時(shí)還(hái)可(kě)以¥≤↕去(qù)連接多(duō)個(gè)别的(¶₹&≠de) ZeroMQ socket 監聽(tīng)♦ ★的(de) endpoint;隻要(yào)雙方的(de)模式配→©≠套,就(jiù)可(kě)以實現(xià∏€←n)正常的(de)消息收發。比如(rú)對÷ ♠γ(duì)于圖中的(de) REP 來(lái)說(shuō),reλ cv 會(huì)公平地(dì)從(cóng)不"£(bù)同客戶端收取消息,而接著(zhe ✔♠)調用(yòng)的(de) send 則會(huì±Ω)把相(xiàng)應返回給對(duì)應的(de)δ↕客戶端。
像 ZeroMQ 這(zhè)種重度的(d&δ e)網絡 I/O 集中、連接數(shù)又 α¶"(yòu)多(duō)的(de)庫,是(shì)适合使用(yòng)¶ ♦異步并發模型來(lái)實現(xiàn)的(de),官方的(de) ' ZeroMQ 實現(xiàn)正是(shì↓↓♦)如(rú)此,但(dàn)是(shì)用(yòng) C++ ™™•"實現(xiàn)的(de),叫做(zuò) libzmq。簡單•來(lái)說(shuō)(異步基礎知(zhī)識部分(f♥₹π↓ēn),了(le)解的(de)同學可(kě δ¶ )小(xiǎo)憩片刻),libzmq 會(huì)開(kāi)啓幾個(g≈÷±è) worker 線程,每個(gè) woγ¥® rker 裡(lǐ)跑著(zhe)一(yī)個(gè)循環,叫做(zu€∑<ò)事(shì)件(jiàn)循環(EventLoop),每次循環會(hu&✘☆σì)處理(lǐ)一(yī)個(gè)排隊進來(l$✔≠ái)的(de)異步任務,比如(rú)發一(yī)條消息,或者處理(× ™₽lǐ)一(yī)個(gè)超時(shí)↑α→的(de)對(duì)象等。對(duì)于 libzmq ≥σ的(de)用(yòng)戶來(lái)說(shuō),•<≠你(nǐ)從(cóng)自(zì)己的(d★≤e)線程裡(lǐ)調用(yòng) send,隻是(shì)把要(y$>ào)發送的(de)數(shù)據放(fàng)在了(l§∑φ×e)一(yī)個(gè)隊列裡(lǐ),↓♥↔隻有(yǒu)當某個(gè) worker 的(de) EventLoop ©₹處理(lǐ)到(dào)這(zhè)條任務時(∞∑shí),數(shù)據才會(huì)真正被發送,這(✘¶zhè)叫做(zuò)異步。并發則是(shìλ₽↔♣)說(shuō),用(yòng) libzmq 你(nǐ)可(kě)以同時(✔©♦shí)連接很(hěn)多(duō)個(g∞"↑✔è)不(bù)同的(de) socket,每一(yī)個(gα↑è)都(dōu)在不(bù)停地(dì)異步收發消息&mda ♥sh;—你(nǐ)的(de)處理(lǐ)可(kě)能(÷ ↕☆néng)是(shì)單線程的(de),∑&β但(dàn)在 worker 裡(lǐ)¥∞卻是(shì)并發的(de)(假如(rú)隻有(yǒu)一(yī)個λφ(gè) worker,用(yòng)戶↑&☆空(kōng)間(jiān)的(de)收發固然不(bù)能(nén↕•≤↑g)并行(xíng),即在同一(yī)時(shí)刻發生(shēng±♦ ),但(dàn)可(kě)以并發,即多(duō)條連接的(••de)多(duō)個(gè)消息可(kě)以同時(shí)排隊等待被收發)。
zmq.rs則是(shì)用(yòng) Rust 語言重新實現(¥←φxiàn)的(de)一(yī)個(gè)實驗性♦§β質的(de) ZeroMQ 庫,自(zì)然也(yě)(想)用(yòng) ©÷到(dào)異步并發模型。Rust 語言本身(shēn)曾經內(nèi)置了(¥£le)基于 libuv 和(hé)協程的(♥±→de)異步并發模型(M:N),所以早先寫的(de)zmq.rs是(shì)基于老(lǎo)版本的(de) Ru→↓st 的(de)異步并發模型的(de)。但(dàn)©©↔在 1.0 前後,Rust 移除了(le) M:N,↕★ £所以zmq.rs面臨著(zhe)一(yī)次重寫,而因為(wèi)個(gè)人(réε§&n)時(shí)間(jiān)原因,還(®→hái)沒寫,不(bù)好(hǎo)意思。
關于Rust 異步并發的(de)那(nà)些(xi£¶ē)事(shì)兒(ér),這(zhè)得(de÷γ♠®)從(cóng)協程開(kāi)始說(shuō),了(le)解的₩®&(de)同學請(qǐng)再次卧倒。
前面提到(dào)了(le),在 EventLoop 中異步執行(xíng)£×的(de)事(shì)件(jiàn)處理(lǐ÷≈β®)邏輯。假想一(yī)下(xià),如(rú)果邏輯是(shì )這(zhè)樣的(de):從(cóng) A 和(héα₹π) B 各接收一(yī)個(gè)數(shù)字,加起來(lái)發給 C ¶↓然後保存結果,那(nà)麽這(zhè)段邏輯要(yào)拆成 4 個(gè×₽π)函數(shù):
隻是(shì)因為(wèi),EventLoop 一(yī)次循環隻'✔<$能(néng)執行(xíng)一(yī)段λ÷≈順序邏輯——也(↔↓∏yě)就(jiù)是(shì)一(yī)>&™£個(gè)函數(shù),而需要(yào)多(duō)次 I/O 交互才₹ 能(néng)完成的(de)邏輯就(jiù)隻能(nén∞↓¶♠g)通(tōng)過多(duō)個(gè)回調函數(shù)串在一λ(yī)起來(lái)表達。如(rú)果邏"β輯再複雜(zá)一(yī)點,就(jiù)有(yǒu)專業(y•è)術(shù)語來(lái)描述這(zhè)種情形 ✔了(le),叫做(zuò) callbac ≈k hell,比如(rú)生(shēng)寫 JavaScrip¥t 動畫(huà)或者老(lǎo)版本的(de) TwistedΩ" 都(dōu)生(shēng)動展現(xiφφε←àn)過這(zhè)一(yī)情形。
使用(yòng)協程可(kě)以把以上(shàng) 4 個(gè)函數(♠∑shù)通(tōng)過一(yī)個(gè)函數(shù)(或者叫協程)來(lφεái)表達(借用(yòng)一(yī)下(xià) Pytho©✔ n 3.5 的(de)語法):
前面提到(dào)過的(de) M:N 中的(de) M 指的(de)就(<≤jiù)是(shì) M 個(gè)協程,N 則是(shì) N 個≈™(gè)操作(zuò)系統線程,也(yě)就(jiù)是(shì ♥) M 個(gè)協程跑在 N 個(gè)操作(zuε₽βεò)系統線程上(shàng)。在 1.0 之前一(yī)段時(shí)間≠££(jiān),Rust 內(nèi)置了(le) l∏↓ibuv 作(zuò)為(wèi) EventLoop,libgreen≈≤∏÷ 則是(shì)協程支持和(hé)調度,M:N 模型曾經是(shì) Rustα♦ 語言的(de)默認配置。一(yī)個(gè) Task 就(jiù)是(∏α₩≠shì)一(yī)個(gè)協程,也(yě)就(jiù)是(shì÷&≠) M Tasks : N Threads。zmq.rs就(jiù)大(dà)概是(shì)這(zhè)個(g☆©è)時(shí)期寫的(de),大(dà)概長(cháng)這(zhè)樣:

用(yòng)戶擁有(yǒu) ZmqSocket 對(duγ §≈ì)象,而其下(xià)的(de)所有(yǒu)網絡操作(zuò)§↑→都(dōu)是(shì)放(fàng)在單獨的(de) Taλ'₽sk 裡(lǐ)面實現(xiàn)的(de),與 ZmqSocket 通 ↔(tōng)過 Channel 交換信息,↕↔φ∏比如(rú)圖示中的(de) TcpListe≤™ ner,用(yòng)戶調用(yòng)一(yī)次 bind 就&←♠(jiù)會(huì)創建一(yī)個(gè)新的∞©>>(de) TcpListener,而 TcpList&♣ener 做(zuò)的(de)工(gōng)作(zuò)也(yσ≥ ě)非常簡單,在死循環裡(lǐ)不(bù)斷地(dì)接受新連進來✔↓'(lái)的(de)客戶端連接,然後把連接∑€¶對(duì)象通(tōng)過 Channel 發還(hái)給 Zmq±♣Socket。這(zhè)樣的(de)設計( §•jì)十分(fēn)簡單粗暴,但(dàn)在 ¶→>M:N 的(de)模型下(xià)也(yě)講得(de)通(↓✘♠tōng),而且效率和(hé)并發數(shù)從(cóngα←)理(lǐ)論上(shàng)來(lái)講應該是(shì)相(xiàng)當♠§♠Ω理(lǐ)想的(de)。因為(wèi),協程庫♦δ在 Rust 裡(lǐ)之所以叫做(zuò) libgreen,因為(wè$→i)協程應該是(shì)輕量級的(de)≠™↓,綠(lǜ)色的(de),內(nèi)存開(kāi)銷≥πσ©極少(shǎo)的(de),随随便便創建個(gè)幾百億÷→Ω(誇張)應該是(shì)輕松無壓力的(de),而且協程間(jiān)的(de±÷)切換應該也(yě)是(shì)非常快(kuài)的(de)(在數(shù)量 級上(shàng)比操作(zuò)系統線程切換快(σ≈₩γkuài))。
後來(lái)由于需要(yào)和(hé)語言定←"位問(wèn)題,開(kāi)發人(rén)員(yuán)增加了(®" le) 1:1 模型,也(yě)就(jiù)是(shì)$φ沒有(yǒu) EventLoop 和(hé)協程的(dΩ£✘♠e)普通(tōng)同步阻塞模型,類似生(§"↑'shēng)寫 C 代碼也(yě)是(shì) ↔∞ ™1:1 模型,Rust 裡(lǐ)的(de✔₹σ₽)話(huà)也(yě)就(jiù)是(shì) 1 Task : 1 Thrφ' ead。再後來(lái),1:1 頂替 M:N 成為(wèi)★₽ Rust 運行(xíng)時(shí)的(de)默認模型,zmq.rs需要(yào)單獨配置才能(néng)享受 M:N 了(le)。再再後來(lá≈λi),M:N 被删掉了(le),Task 被改名為(wèi) Thre✘∞±ad。
被删掉其實也(yě)是(shì)對(duì)的(de),因為(wèi)₩↓ Rust 的(de)運行(xíng)時(shí)一(yī)直想要(yào)從"€(cóng)接口上(shàng)統一(yī) 1:1 和(hé) M:N 兩種♠×實現(xiàn),但(dàn)是(shì)其實這(zhè®&)倆的(de)差異還(hái)是(shì)很(hěn)大(dà)的≠∑¶σ(de),統一(yī)的(de)美(mě∏®↑i)好(hǎo)理(lǐ)想在巨大(dà)的(de≤≠)成本現(xiàn)實面前變得(de)飄渺,再加上£®∏↕(shàng) Rust 語言本身(shēn)的(de)一(y♦ī)些(xiē)內(nèi)情——相(λ≥xiàng)較于操作(zuò)系統線程,libgreen 并不(bù↔δ↔) green,內(nèi)存開(kāiΩ₽)銷并不(bù)比操作(zuò)系統線程小(xiǎo)多(duō)少(shǎ♣'o)——雖然切換的(de)低(dī)成本優勢仍在(λ©×∑沒說(shuō)錯(cuò)吧(ba)?),但(dàn)是(shì>☆≥)從(cóng)長(cháng)計(jì)議(yì)→ ,libgreen 從(cóng)标準庫中被剔除,成為(wèi₩ ¶)了(le)一(yī)個(gè)沒人(ré¶←≠n)維護的(de)第三方庫。至此,zmq.rs也(yě)沒法寫下(xià)去(qù)了(le)♠•,除非自(zì)己實現(xiàn)一(yī)遍異步并≈₽← 發的(de)模型(更别提協程了(le)),否則随随便便開( →"↕kāi)幾千個(gè)線程也(yě)是(shì)醉了(le)±∞。很(hěn)早之前的(de) Rust 官網首頁介紹φ≥>中,是(shì)有(yǒu) Concurrency 字樣的(de),≠≤現(xiàn)在再去(qù)看(kàn)看(k←©±àn)呢(ne),木(mù)有(yǒu)了(le)。δ
曆史就(jiù)說(shuō)這(zhè)些(xiē),接下( ↑₹xià)來(lái)是(shì)後來(lá♦≥♦i)發生(shēng)的(de)事(shì)情和(hé)将來(lá÷>i)打算(suàn)要(yào)做(zuòΩ®↓)的(de)東(dōng)西(xī)。
沒有(yǒu)異步網絡庫怎麽能(néng)行(xíng),Rust 的(de☆'<)生(shēng)态社區(qū)還(hái)是(shì)很(hěn)給力的§•β(de),很(hěn)快(kuài)便有(yǒu)人(rén)填☆Ω♠ 補了(le)這(zhè)一(yī)空(kōngγ©> )白(bái)。MIO 類似于 libu✘α∑$v,專門(mén)為(wèi) Rust≠♥ 語言提供 EventLoop 和(hé)異↓§∞步網絡支持;我們中國(guó)社區(qū)(Rust."Ωcc)的(de) ELTON(也(yě)在群裡(lǐ)'φ)接著(zhe)做(zuò)了(le) coroutine-£✘rs,專門(mén)為(wèi) Rust 語₹∞ ↕言提供協程支持;後來(lái)又(yòu)有(yǒu)人 $(rén)寫了(le) mioco,把 MIO 和(™™hé) coroutine-rs 結合在了(le↕< )一(yī)起(雖然目測 ELTON 同學想要(yào)自(zì)己寫↓≥≤>一(yī)個(gè)更高(gāo)端的(de)εγ"¶調度器(qì)嘿嘿)。所以,接下(xià)來(lái)®Ω≤←zmq.rs要(yào)做(zuò)的(de)就(jiù)是(shì)遷移遷移α¶£>,用(yòng)這(zhè)些(xiē)新工(gōng)具再次重新實現(xiβ &±àn)一(yī)遍。
