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