如何正確運用非同步編程技術

来源:http://www.cnblogs.com/zfanlong1314/archive/2017/09/06/7487724.html
-Advertisement-
Play Games

一、什麼是同步和非同步? 同步(英語:Synchronization),指對在一個系統中所發生的事件(event)之間進行協調,在時間上出現一致性與統一化的現象。說白了就是多個任務一個一個執行,同一時刻只有一個任務在執行。 非同步(英語:Asynchronization),指的是讓CPU暫時擱置當前請求 ...


一、什麼是同步和非同步?

同步(英語:Synchronization),指對在一個系統中所發生的事件(event)之間進行協調,在時間上出現一致性與統一化的現象。說白了就是多個任務一個一個執行,同一時刻只有一個任務在執行。

非同步(英語:Asynchronization),指的是讓CPU暫時擱置當前請求的響應,處理下一個請求,當通過輪詢或其他方式得到回調通知後,開始運行。多線程將非同步操作放入另一線程中運行,通過輪詢或回調方法得到完成通知,但是完成埠,由操作系統接管非同步操作的調度,通過硬體中斷,在完成時觸發回調方法,此方式不需要占用額外線程。

二、在ASP.NET MVC項目中我們應該何時的使用非同步控制器?

2.1、ASP.NET MVC 中為什麼需要使用非同步呢?

IIS有一個線程池來處理用戶的請求,當一個新的請求過來時,將調度池中的線程以處理該請求,然而,但併發量很高的情況下,池中的線程已經不能夠滿足這麼多的請求時候,池中的每一個線程都處於忙的狀態則在處理請求時將阻塞處理請求的線程,並且該線程不能對另一個請求提供服務,如果請求隊列已滿,則 Web 伺服器會拒絕請求並處於 HTTP 503繁忙狀態。如果是處理一些高延遲,例如網路操作,這樣的線程大多數只是等待狀態大部分時間是不做任何事情的,這樣的線程就可以使用非同步編程更好的充分利用。

三、同步和非同步使用場景

場景描述一:如果某個請求生成一個需要兩秒鐘來完成的網路調用,則該請求無論是同步執行還是非同步執行都需要兩秒鐘。 但是,在非同步調用的過程中,伺服器在等待第一個請求完成的過程中不會阻塞對其他請求的響應。 因此,當有許多請求調用長時間運行的操作時,非同步請求可以防止出現請求排隊的情況。

場景描述二:假設我有三個操作,分別耗時500, 600和700毫秒。採用同步調用的話,總共的響應時間將會稍微超過1800毫秒。然而,如果是非同步調用(併發),總共響應時間將會稍微超過700毫秒,因為那是最長的任務/操作的持續時間。因此:當一個action必須執行多個獨立的長期運行的操作時,非同步action方法是很有用的。

3.1、在滿足以下條件時使用同步管線:

1)、操作很簡單或運行時間很短。

2)、簡單性比效率更重要。

3)、此操作主要是 CPU 操作而不是包含大量的磁碟或網路開銷的操作。 對 CPU 綁定操作使用非同步操作方法未提供任何好處並且還導致更多的開銷。

3.2、在滿足以下條件時使用非同步管線:

1)、操作是網路綁定的或 I/O 綁定的而不是 CPU 綁定的。

2)、測試顯示阻塞操作對於網站性能是一個瓶頸,並且通過對這些阻塞調用使用非同步操作方法,IIS 可對更多的請求提供服務。

並行性比代碼的簡單性更重要。

3)、您希望提供一種可讓用戶取消長時間運行的請求的機制。

四、Q&A環節

4.1、既然非同步可以大大提供應用程式的響應能力?那麼ASP.NET MVC 如果全部用非同步控制器(Async Controller),會有什麼效果?會成為高吞吐量,高併發的網站麽?

僅僅只是把代碼加個async事實上不會帶來任何性能的提升,必須在需要非同步的地方(IO)非同步執行才能真正提升吞吐量。非同步Controller多用於I/O密集型操作,比如讀寫數據,且操作之間較為獨立;而CPU密集型操作則不適用與非同步——無論你是非同步處理還是同步處理,最終CPU都會被頂滿。所以非同步操作確實可以達到提高併發數的效果,但具體還是要看你把它用在哪裡。全部使用非同步Controller並不會絕對達到提高站點性能的作用。

六、參考文獻

看stackoverflow大牛如何回答何時在ASP.NET中使用非同步控制器?

ASP.NET MVC中使用非同步控制器

ASP.NET MVC什麼時候使用非同步Action

ASP.NET MVC 如果全部用非同步 Controller,會有什麼效果?會成為高吞吐量,高併發的網站麽?




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說明:文章所有內容截選自實驗樓教程 "【Vim編輯器】" ~ Vim 快速入門 一、實驗介紹 1.1 實驗內容 本次實驗將學習vim中的不同模式和一些基本操作。 1.2 實驗知識點 + Vim中的六種基本模式 + Vim中的基本操作 1.3 課程來源 "VIM 線上手冊" 二、實驗步驟 2.1 vi ...
  • 本文中的提到GNU擴展時,表示該功能是GNU為sed提供的(即GNU版本的sed才有該功能),一般此時都會說明:如果要寫具有可移植性的腳本,應儘量避免在腳本中使用該選項。 本文中的正則表達式幾乎和grep中支持的一樣。但還是有少數幾個是sed自身才能解析的表達式。因此本譯文中只對這些sed自身才支持 ...
  • Ubuntu安裝坑: 1、對於新手第一次安裝ubuntu,特殊情況會出現因為解析度問題導致安裝界面不全,無法進行下一步操作。 解決方案:使用alt+滑鼠左鍵拖動屏幕Linux文件名亂碼問題: 2、因為windows對於中文的編碼預設使用GBK,而linux系統上統一使用UTF-8進行編碼,這就導致大 ...
  • 回到目錄 對於業務層的程式的致命錯誤,我們一直的做法就是直接拋出指定的異常,讓程式去終斷,這種做法是對的,因為如果一個業務出現了致命的阻塞的問題,就沒有必要再向上一層一層的返回了,但這時有個問題,直接拋異常,意味著伺服器直接500了,前端如何去顯示,或者如果你是API的服務,如果為前端返回,如果是5 ...
  • 最近在學習百度的開源上傳組件WebUploader,上一篇文章,學習了批量文件上傳,今天學習一下批量圖片上傳,實際上與文件上傳很類似,只是添加了圖片顯示功能,這個功能WebUploader組件中已經提供了。 ...
  • 作為微軟下一代的開源的跨平臺的開發框架, Asp.net core 正在吸引越來越多的開發者基於其構建現代 web 應用。 目前, Azure App Service 也實現了對 asp.net core 的支持。 用戶所開發的 ASP.NET Core Web 應用, 以與通常 Asp.net W ...
  • 微信小程式給我們提供了一個很好的開發平臺,可以用於展現各種數據和實現豐富的功能,通過小程式的請求Web API 平臺獲取JSON數據後,可以在小程式界面上進行數據的動態展示。在數據的關鍵 一環中,我們設計和編寫Web API平臺是非常重要的,通過這個我們可以實現數據的集中控制和管理,本篇隨筆介紹基於... ...
  • 1.委托的典型用法 1.1定義一個委托: 1.2 定義一個MyClass類,放置一個滿足 AddDelegate委托要求的方法 1.3定義一個委托變數 1.4實例化一個MyClass對象,並將其 Add方法引用傳給委托變數del 1.5通過委托變數調用MyClass對象的 Add()方法 總結:定義 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...