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