国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【妙用協(xié)程】 - I/O阻塞和流程阻塞

xinhaip / 2663人閱讀

摘要:所以我們這里談的流程阻塞只是一種簡(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ān)文章

  • 妙用協(xié)程】 - 可持久化的協(xié)程能被用來(lái)實(shí)現(xiàn)工作流

    摘要:常規(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í)行到的地方原樣拉起...

    wpw 評(píng)論0 收藏0
  • Python中的并發(fā)處理之使用asyncio

    摘要:并發(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...

    tuniutech 評(píng)論0 收藏0
  • Tornado 4.3文檔翻譯: 用戶指南-異步阻塞I/O

    摘要:譯者說(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)步。其次...

    smartlion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<