摘要:所以我們這里談的流程阻塞只是一種簡(jiǎn)化的流程建模的實(shí)現(xiàn)。在某種意義下,阻塞和流程阻塞都是阻塞問(wèn)題。
咱不咬文嚼字地掰什么是Blocking I/O,什么是Async I/O,沒(méi)啥意思。代碼是用來(lái)解決問(wèn)題的。有的時(shí)候透徹理解問(wèn)題,會(huì)比透徹理解某個(gè)具體的解法更重要。
I/O阻塞的問(wèn)題來(lái)源就是,當(dāng)我們需要輸入輸出的時(shí)候,特別是通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)的時(shí)候。從請(qǐng)求發(fā)出,到得到對(duì)方的應(yīng)答確認(rèn)是一段時(shí)間的。比如說(shuō)代碼中調(diào)用
sock.connect()
實(shí)際對(duì)應(yīng)的TCP包有三個(gè)
client = syn => server client <= syn+ack = server client = ack => server
這一來(lái)兩去的不得好幾百ms么?在這段時(shí)間內(nèi),執(zhí)行I/O操作的程序其實(shí)是被阻塞住了不能去干別的事情的。如何讓機(jī)器在等待I/O的時(shí)候同時(shí)干別的事情從而充分利用資源就是我們要解決的問(wèn)題。
流程阻塞的問(wèn)題與I/O阻塞的問(wèn)題類似,比如
stop_server() migrate_db_to_newer_version() start_server()
我們有一個(gè)三步驟的流程,第一步把服務(wù)器停掉,可能要花1分鐘,第二步升級(jí)數(shù)據(jù)庫(kù),可能要花30分鐘,第三步在升級(jí)之后把服務(wù)器重新啟動(dòng)起來(lái),可能需要30秒。這樣的一個(gè)流程在執(zhí)行的時(shí)候,對(duì)于執(zhí)行者來(lái)說(shuō)也是被阻塞了的。為了充分利用資源,同樣希望執(zhí)行上述腳本的機(jī)器能夠在流程等待的時(shí)候同時(shí)去干點(diǎn)的事情。甚至如下面的流程
if is_approved_by_admin(): stop_server() migrate_db_to_newer_version() start_server()
如果流程中需要人工審批,我們甚至希望執(zhí)行該流程機(jī)器可以徹底把資源釋放,把流程狀態(tài)存到數(shù)據(jù)庫(kù)里,等用戶審批確認(rèn)的時(shí)候再把流程繼續(xù)執(zhí)行。
當(dāng)然除了能夠在等待的時(shí)候更充分地利用資源之外,流程這個(gè)領(lǐng)域往往還有更高的要求。比如很多情況下我們希望能夠在阻塞狀態(tài)下,清楚地知道每個(gè)流程的當(dāng)前狀態(tài),甚至是對(duì)狀態(tài)進(jìn)行一些人工干預(yù)。經(jīng)典的工作流的需求有三種建模方法,一種是我們這里使用的串行process的方式,另外一種是FSM(有限狀態(tài)機(jī)),另外一種是petri net。所以我們這里談的流程阻塞只是一種簡(jiǎn)化的流程建模的實(shí)現(xiàn)。
在某種意義下,I/O阻塞和流程阻塞都是阻塞問(wèn)題。對(duì)于編碼實(shí)現(xiàn)去解決阻塞問(wèn)題的碼農(nóng)來(lái)說(shuō),就是如何用代碼告訴計(jì)算機(jī)如何處理阻塞:
在阻塞的時(shí)候同時(shí)去干點(diǎn)什么別的事情
阻塞前后的代碼邏輯如何連貫起來(lái)
從實(shí)現(xiàn)的效果上來(lái)說(shuō)兩個(gè)評(píng)價(jià)標(biāo)準(zhǔn)
快不快:并發(fā)數(shù),吞吐量,延遲
好不好懂:我認(rèn)為閱讀相關(guān)代碼時(shí)候眼球移動(dòng)距離可以用來(lái)度量Logic Locality。這個(gè)指標(biāo)可以用來(lái)代表代碼質(zhì)量
在如何表達(dá)“阻塞如何處理”這個(gè)問(wèn)題上,有太多經(jīng)典模式了。比如多線程,selector,proactor,協(xié)程等。每種模式解決的問(wèn)題是一樣的,無(wú)非就是在快不快和好不好懂兩個(gè)問(wèn)題上做了不同的取舍而已。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/45307.html
摘要:常規(guī)版本的的是不可以被持久化保存的。在流程被阻塞的時(shí)候比如需要審批老板不在把協(xié)程持久化成入庫(kù),等流程不再阻塞的時(shí)候把協(xié)程重新從數(shù)據(jù)庫(kù)里拉起來(lái)繼續(xù)執(zhí)行。 常規(guī)版本的Python的generator是不可以被持久化保存的。但是stackless和pypy這兩個(gè)修改版本的Python解釋器可以。下面這段代碼演示了如何把一個(gè)執(zhí)行中的函數(shù)持久化保存,然后過(guò)段時(shí)間再把函數(shù)從上次執(zhí)行到的地方原樣拉起...
摘要:并發(fā)用于制定方案,用來(lái)解決可能但未必并行的問(wèn)題。在協(xié)程中使用需要注意兩點(diǎn)使用鏈接的多個(gè)協(xié)程最終必須由不是協(xié)程的調(diào)用方驅(qū)動(dòng),調(diào)用方顯式或隱式在最外層委派生成器上調(diào)用函數(shù)或方法。對(duì)象可以取消取消后會(huì)在協(xié)程當(dāng)前暫停的處拋出異常。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、了解asyncio...
摘要:譯者說(shuō)于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。 譯者說(shuō) Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次...
閱讀 3268·2021-09-23 11:55
閱讀 2609·2021-09-13 10:33
閱讀 1668·2019-08-30 15:54
閱讀 3097·2019-08-30 15:54
閱讀 2364·2019-08-30 10:59
閱讀 2370·2019-08-29 17:08
閱讀 1805·2019-08-29 13:16
閱讀 3589·2019-08-26 12:25