99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

異步編程需要“意識”-創新互聯

雖然我們生活在一個異步的世界里,但對于多數編程初學者來說,異步還是很陌生。學習一門編程語言,通常都是從同步流程開始的,即順序、分支和循環。而異步流程是什么呢——開始一個異步調用,然后……就沒有然后了。異步程序跑哪去了?

成都創新互聯公司長期為1000多家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為澤庫企業提供專業的成都網站制作、成都做網站、外貿營銷網站建設澤庫網站改版等技術服務。擁有十載豐富建站經驗和眾多成功案例,為您定制開發。

異步程序會以某種異步的形式在運行著,比如多線程、異步IO等,直到處理完成。那如果需要處理結果怎么辦?給一個程序入口,讓它處理完當前過程之后,把處理結果送到這個入口,然后執行另一段程序——俗稱回調。回調一般使用callback這個名稱,不過有時候我更喜歡使用next,因為它代表著下一個處理步驟。

同步和異步的概念

現在我們接觸到了一些概念,比如同步和異步,它們是什么?

這兩個概念并不來源于編程語言,而是來源于低層指令,甚至更低層的——電路。它們是基于時序的兩個概念,其中,“步”是指步調,所以同步表示相同的步調,而異步表示不同的步調。當然這兩個概念提升到程序這個級別的時候,精確的意思與時鐘無關,但所表示的意義仍然未變。

同步

舉個生活中的例子來說明這個問題——排除買票。售票廳開了一個窗口,有一隊人在排隊依次買票。這個隊伍中,前面一個人往前走了一步,后面的人才能往前走一步;前面的人在等待,后面的人就一定在等待。那么在理想的情況下,所有人可以同時向前邁步。OK,大家步伐一致,稱為同步。

這里把售票窗口看作是處理器,每個人看作是等待執行的指令,買票這個動作就是在執行指令。它的特點是按步就班,如果一個人買票時間過長(指令執行時間過長),就會造成阻塞。

異步(多線程)

現在買票的人漸漸多起來,所以售票廳多開了幾個窗口同時售票。每個單獨的隊伍仍然保持著同步,但不同的隊伍之間,步伐不再一致,稱為異步。A 隊列售票很順利,隊伍在有序快速的前進,但 B 隊列的某個顧客似乎在付費時遇到點麻煩,花了很長的時候,造成阻塞,但這對 A 隊列并不產生影響。

這時候的售票廳可以看作是在以多線程的方式運行著異步程序。從這個例子可以看到異步的兩個特點:其一,兩個異步流程之間相互獨立,它們相互不會阻塞(有個前提,不需要等待共享資源的情況下);其二,異步程序內部仍然是同步的

異步(IO)

上面的例子比較符合多線程異步的情況。那 IO 異步又是什么樣呢?

年底了,M 在準備年終匯報的資料,這可是個緊張的工作(CPU),要收集不少數據來寫好些文案。為了其中一份文案,M 需要車間的生產數據,但跑一趟車間(IO)可需要花不少時間,所以他讓 N 去車間收集數據,自己則繼續寫其它方案,同時等 N 把數據收集回來(啟動異步程序)。半天以后,N 帶回了數據(插入事件消息),M 繼續完成手上的文案(完成當前事件循環),之后使用 N 帶回來的數據開始撰寫關于車間的報告(新的事件循環)……

IO 的處理速度比 CPU 慢得多,所以 IO 異步讓 CPU 不必閑置著等待 IO 操作完成。當 IO 操作完成之后,CPU 會適地使用 IO 操作結果繼續工作。

同步邏輯和異步邏輯

回到程序上來,我們以一個函數的處理過程來描述同步和異步的處理方式。

同步邏輯

那么,同步處理過程是:

接受輸入 ? 處理 ? 產生輸出

用一段偽代碼來描述就是

注:本文中的偽代碼比較接近 JavaScript 語法,而有時候為了說明類型,采用了 TypeScript 的類型申明語法。

function func(input) {
    do something with input
    return output
}

這是標準的 IPO(Input-Process-Output) 處理。

異步邏輯

而異步呢,是:

接受輸入 ? 處理 ? 啟動下一步(如果有)

用偽代碼來描述就是:

function asyncFunc(input, next) {
    do something with input
    if (next is a entry) {
        next(output)
    }
}

這個過程稱為 IPN(Input-Process-Next)。

注意到這里的 Next,下一步,只有一步。這一步,囊括了后續的若干步驟。所以這一步,只能是后續若干步驟封裝出來一個模塊入口,或者說函數。

因此,模塊化思想在異步思維中是一個非常關鍵的思想。很多初學者寫代碼喜歡像記流水賬一樣一句句往下寫,動不動就是成百上千行的函數,這就是一種缺乏模塊化思想的表現。模塊化思想需要訓練,分析代碼的相關性,提煉函數,提取對象,在具有一定經驗之后還需要掌握模塊細化的粒度平衡。這不是一朝一夕之功,不過我推薦看看“設計模式”和“重構”相關的書籍。

異步開發工具(SDK和語法層面的) 承諾(Promise)

再想想上面關于年終匯報的例子,M 請 N 去車間收集數據的時候,N 會說:“好的,我很快就把數據帶回來”,這是一種承諾。基于這個承諾,M 才能安排后面撰寫關于車間的匯報材料。這個過程用偽代碼來描述就是

function collectData(): Promise {
    // N 去收集數據,產生了一個承諾
    return new Promise(resolve => {
        collect data from workshop
        // 這個承諾最終會帶來數據
        resolve(data)
    })
}

function writeWorkshopReport(data) {
    write report with data
}

// 收集數據的承諾兌現之后,可將這個數據用于寫報告
collectData()
    .then(data => writeWorkshopReport(data))

以 JavaScript 為代表的一些語言 SDK 中使用了Promise。不過 C# 中是采用的TaskTask<T>,相應的,使用了Task.ContinueWithTask<T>.ContinueWith來代替Promise.then

異步邏輯同步化

上面提到了同步思維和異步思維在一個處理步驟中的區別。如果跳出一個處理步驟,從更大范圍的處理流程來看,異步與同步其實也沒多大區別,都是輸入-->處理-->產生輸出-->將輸出用于下一步驟,唯一要注意的是需要等待異步處理產生的輸出,我們可以稱之為異步等待。由于我們可以一邊進行異步等待(async wait,簡寫 await),一邊做別的事情,所以這個等待并不產生阻塞。但是,由于聲明了這個等待,編譯器/解釋器會將后面的代碼自動放在等待完成之后調用,這讓異步代碼寫起來就像寫同步代碼一樣。

上面的例子使用異步等待的偽代碼會像這樣

async function collectData(): Promise {
    collect data from workshop
    // 多數語言會把 async 函數的返回值封裝成 Promise
    return data
}

function writeWorkshopReport(data) {
    write report with data
}

// await 只能用于聲明為 async 的函數中
async function main() {
    data = await collectData()
    writeWorkshopReport(data)
}

// 定義了異步 main 函數,一定要記得調用,不然它是不會執行的
main()

像 C# 和 JavaScript 等語言都從語法層面規定了await必須用在聲明為async的函數中,這就從編譯/解釋的層面限定了await的用途,只要使用了await,那它所處的就一定是一個異步上下文。而async也要求編譯器/解釋器對其返回值進行一些自動處理,比如在 JavaScript 中,其返回值如果不是 Promise 對象,它會自動封裝成一個 Promise 對象;而在 C# 中,它會自動封裝成TaskTask<T>(所以async方法的類型需要聲明為TaskTask<T>)。

注意,注意,注意

盡管語言服務在異步程序同步化方面已經做了很多工作,但是仍然避免不了一些人為錯誤,比如忘記寫await關鍵字。在強類型語言中編譯器會檢查得嚴格一些,但如果是在 JavaScript 中,忘記寫await意味著原本應該取得一個值的語句,會取到一個 Promise。解釋器不會對此質疑,但程序運行的結果會不正確。

小結

總的來說,異步編程并不是特別困難的事情。使用 async/await 語言特性甚至可以用類似編寫同步代碼的方法來編寫異步代碼。但語法糖終究是糖,要想把異步編程掌握得更好,還是需要去了解和熟悉異步、回調、Promise、模塊化、設計模式、重構等概念。

相關閱讀
  • 從小小題目逐步走進 JavaScript 異步調用
  • 閑談異步調用“扁平”化
  • 理解 JavaScript 的 async/await
  • C# 并行計算(Parallel 和 ParallelQuery)

網站欄目:異步編程需要“意識”-創新互聯
文章轉載:http://www.yijiale78.com/article32/dcodsc.html

成都網站建設公司_創新互聯,為您提供網站設計網站收錄網站排名搜索引擎優化商城網站品牌網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設