新聞中心
神秘使者“久聞Java語言跨越平臺,框架眾多,不過二十年功夫,就已晉升天下第一編程語言,今日一見,果然名不虛傳吶!”

“使者先生您過獎了,咱們快些走,國王陛下已經(jīng)等候多時了”
今日,Java帝國朝堂之上迎來了一位神秘的來賓。
來到大殿之上,只見國王正襟危坐,閉目養(yǎng)神,不怒自威,堂下群臣咸集,紛紛側(cè)目。
“來者何人?”,國王一旁的內(nèi)侍問到。
“我乃GoLang帝國使者——Goroutine”,使者答道。
“GoLang帝國?何方番邦小國?寡人竟從未聽聞”,國王閉眼說到。
說罷,群臣皆笑了起來。
“來此所為何事?”,內(nèi)侍繼續(xù)問到。
使者回答:“我此行特為傳道而來”
說完,國王睜開了眼睛,“傳道?我Java帝國乃天下第一編程帝國,只有我們傳出去,哪有學(xué)別人之道?”
使者不卑不亢,說到:“Java帝國雖如日中天,但卻有一處缺陷,假以時日,必成大患”
“哦,你倒是說說看,如若言語不通,即刻轟出殿去?!保瑖鯀柭暫鹊?。
“敢問陛下,Java線程執(zhí)行到阻塞函數(shù)時,該當(dāng)如何?”,使者問到。
一旁的線程大臣見狀,上前說到:“遇到阻塞那自然要被操作系統(tǒng)掛起,切換到別的線程”
“敢問大人,線程切換是否需要成本?如果大量線程頻繁切換,成本又當(dāng)如何?”,使者追問到。
“你若關(guān)心這個問題,那就不用阻塞函數(shù),通過異步回調(diào)來進(jìn)行”,線程大臣答道。
使者嘴角上揚,微微一笑,“好一個異步回調(diào)!異步回調(diào)確實不用阻塞,不過它有兩宗罪,其一:割裂了原來的代碼業(yè)務(wù)邏輯,其二:陷入回調(diào)地獄難以維護(hù)”
“這也不行,那也不行,你這人還真難伺候”,線程大臣有些急了。
使者轉(zhuǎn)身面向國王說到:“啟稟陛下,我有一法,可讓線程遇到阻塞函數(shù)后不需切換線程,也不用異步回調(diào)還可以繼續(xù)運行下去,是高并發(fā)開發(fā)神技”
國王一聽來了興趣:“哦,還有這種事?說來聽聽”
使者拜了一拜,說到:“線程可以在遇到阻塞的地方后,保存執(zhí)行的上下文,轉(zhuǎn)而去執(zhí)行別處的代碼。待阻塞的請求完成后,再轉(zhuǎn)而回去繼續(xù)執(zhí)行”
國王不解,問到:“什么叫轉(zhuǎn)而去執(zhí)行別處的代碼?什么叫回去繼續(xù)執(zhí)行?這函數(shù)執(zhí)行到一半還能中途退出再回來?”
“是的,沒錯!”,使者回答。
此話一出,朝堂上議論紛紛,群臣都露出了鄙夷的笑容。
“簡直荒謬!函數(shù)執(zhí)行從進(jìn)入到return退出,從來都是一氣呵成,哪有中途執(zhí)行一半退出,再回來接著執(zhí)行的道理?簡直聞所未聞!”,一旁的線程大臣說到。
使者繼續(xù)說到:“一氣呵成?恐怕不是吧?線程執(zhí)行函數(shù)中途,遇到時間片用完或者遇到I/O阻塞,就會被操作系統(tǒng)保存上下文后掛起,切換到其他線程。而后等到機會再回過頭繼續(xù)執(zhí)行,不是嗎?”
線程大臣怒斥道:“強詞奪理!你說的這情況是操作系統(tǒng)在調(diào)度管理多個線程,對咱們的應(yīng)用層線程來說都是透明的,無需關(guān)心”
使者沒有退讓,卻問道:“既然操作系統(tǒng)可以調(diào)度管理多個線程,那為何線程不可以調(diào)度管理函數(shù)的執(zhí)行?”
群臣再次交頭接耳,議論起來。
“陛下,此番邦使者妖言惑眾,微臣建議即刻逐出大殿,以正視聽!”
國王應(yīng)允,隨即遣人上前。
不待侍衛(wèi)上前,使者自行離去,邊走邊說到:“可嘆!堂堂Java帝國,卻容不下一個新技術(shù)”
臨別相會
使者心灰意冷,打算離開Java帝國,卻在半道上被人給攔了下來。
“先生請留步,我家主人請先生府上相會”
使者來到府上,原來主人乃當(dāng)?shù)匾桓缓类l(xiāng)紳。
“先生今日在朝堂之事,我已聽說,在下對先生提到的函數(shù)執(zhí)行過程中可中斷和恢復(fù)的技術(shù)頗有興趣,還請先生不吝賜教”,主人說完拜了一拜。
“賜教不敢當(dāng),我此次來Java帝國,所傳之道名叫協(xié)程,是一種高并發(fā)開發(fā)的絕技,可無奈貴國國君與大臣皆不識貨,無功而返,可惜啊,可惜!”,使者嘆息到
“協(xié)程?這是何物?我只聽說過進(jìn)程和線程,卻是從未聽過協(xié)程”
使者起身說到:“線程是操作系統(tǒng)抽象出來的執(zhí)行流,由操作系統(tǒng)統(tǒng)一調(diào)度管理。那在一個線程中,同樣可以抽象出多個執(zhí)行流,由線程來統(tǒng)一調(diào)度管理。這線程之上抽象的執(zhí)行流就是協(xié)程”
主人有些不解,問到:“一個線程怎么會有多個執(zhí)行流呢?”
“這便是我今日在朝堂上說的,線程執(zhí)行函數(shù)遇到阻塞后,可以保存上下文后退出,轉(zhuǎn)而執(zhí)行別處的代碼,這里就從一個執(zhí)行流轉(zhuǎn)向了另外的執(zhí)行流”,使者解釋到。
主人拍案而起,“原來是這個意思,妙哉,妙哉啊!不過,這線程是操作系統(tǒng)在調(diào)度管理,那線程里抽象出來的執(zhí)行流,也就是協(xié)程,該怎么調(diào)度管理呢?操作系統(tǒng)可以通過時鐘中斷和系統(tǒng)調(diào)用進(jìn)入內(nèi)核來剝奪線程的執(zhí)行權(quán),那線程該如何剝奪協(xié)程的執(zhí)行權(quán)來實現(xiàn)調(diào)度管理呢?”
“真是個好問題!線程的調(diào)度由操作系統(tǒng)來管理,是搶占式調(diào)度。而協(xié)程不同,協(xié)程需要互相配合,主動交出執(zhí)行權(quán),這也是協(xié)程的名字——協(xié)作式程序的來歷”
“主動交出執(zhí)行權(quán)?如何辦到?”,主人追問。
“辦法有很多,比如C++帝國有一協(xié)程框架,名叫l(wèi)ibco,他通過HOOK關(guān)鍵的系統(tǒng)函數(shù)來實現(xiàn)調(diào)度器的介入”
“那你們Golang是怎么做的?也是這樣嗎?”
“我們Golang帝國可不一樣,我們先天設(shè)計就是支持協(xié)程,系統(tǒng)調(diào)用都被我們封裝好了,應(yīng)用程序調(diào)用時遇到需要阻塞的,像是文件讀寫Read/Write、Sleep我們的調(diào)度器就能有機會介入,去執(zhí)行調(diào)度管理了”,使者得意的說到。
主人思考片刻,問到:“那我們Java該如何實現(xiàn)呢,還請先生賜教”
“你們Java語言,是通過JVM在執(zhí)行,字節(jié)碼的執(zhí)行都在JVM的掌控之中,要想實現(xiàn)對應(yīng)用代碼執(zhí)行流的中斷和恢復(fù)還不是易如反掌?”,使者說到。
主人點了點頭,若有所思。
新的征程
主人與使者交談甚歡,不知不覺已近黃昏。
主人起身說到:“今蒙先生賜教,大慰平生。還請先生在府上多留時日,我好細(xì)細(xì)請教?!?/p>
使者連連揮手,說到:“我還有要事在身,明日就要離去”
“不知先生欲往何處?”
“聽說C++帝國又要發(fā)布新版本,我打算前往傳道”
主人面露疑惑:“C++帝國不是有l(wèi)ibco了嗎?”
“l(fā)ibco終究不是朝廷之物,此番前去,希望可以讓協(xié)程納入新的官方標(biāo)準(zhǔn)”
翌日清晨,使者拜別主人,策馬離去。
不久,Java帝國朝堂上傳來消息,民間有人推出了協(xié)程框架——Quasar,一時朝野震動。
本文轉(zhuǎn)載自微信公眾號「編程技術(shù)宇宙」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系編程技術(shù)宇宙公眾號。
新聞標(biāo)題:神秘使者到Java帝國傳道協(xié)程,竟被轟了出去!
網(wǎng)站網(wǎng)址:http://m.fisionsoft.com.cn/article/dhchijs.html


咨詢
建站咨詢
