Go語言 萬物皆非同步

2022-07-01 05:15:10 字數 769 閱讀 8013

首先要明確的是,同步(synchronous)和非同步(asynchronous),阻塞(blocking)和非阻塞(non-blocking)是兩種完全不同的概念。前者指的是一種事件通知、處理機制,而後者則是程式控制流程的差異。

我們以a呼叫b為例來說明兩者之間的區別:

「傳統的」一線程對一請求的模型直接決定了單機並不能處理過多的併發請求,而且這種模型下會導致很大的執行緒資源浪費。這裡面原因有二:一是每條執行緒占用要使用較多的記憶體,在jvm中每建立乙個執行緒就要消耗2m多的heap,於是記憶體大小就變成執行緒數量的瓶頸;二是當執行緒資料超過cpu核心數時,頻繁的執行緒切換會變成一筆可觀的開銷,而且當你的程式因為查詢資料庫、執行rpc呼叫阻塞當前執行緒時,這個執行緒是完全不能執行的,不僅白白占用了記憶體,還增加了context switch的次數。

非同步並不能加快你對於單個請求的處理速度,但是它能最大化的消滅資源浪費,從而大大提高單機併發極限。

go中只有協程,而協程本質上就是非同步。

為什麼這麼說呢?首先我們知道,協程(routine)跟執行緒是多對一的關係,routine本身不會被排程執行,它只能依靠作業系統的執行緒來執行。乙個執行緒可以執行多個routine, go執行時排程器負責進行排程處理。routine只有三種情況需要讓出執行權,分別是system call, 鎖競爭和主動讓出執行權力。

仔細想想看,這跟前面講的非同步不是幾乎一樣的邏輯嗎?區別是,go語言中是go自己的排程器來通知routine等待的io事件是否完成,而其它非協程語言則是os來通知。

因此,go中我們雖然在以同步的方式編寫**,但卻與非同步有著異曲同工之妙。

萬物皆檔案

程式 資料 演算法 利用演算法將規定格式的資料儲存到檔案 這就是檔案 office 是乙個典型,doc 格式,htm格式 http協議,到xml json 都是特定格式的檔案。檔案其實就是 協議,裡面儲存的內容 只有按照 規定的協議才能讀取到 不然就是乙個亂碼檔案。加密和解密也是基於這個原理 tlv...

萬物皆物件

math物件是js中的乙個內建物件,他提供了一些數學相關的屬性和方法。console.log math.pi console.log math.floor 2.999 2 console.log math.floor 2.9999 3console.log math.ceil 2.0001 3 co...

Python 萬物皆物件

所有的函式都有乙個內建的 doc 屬性,它會返回在函式源 中定義的 doc string sys 模組是乙個物件,它有乙個叫作 path 的屬性 等等。我們仍然在迴避問題的實質,究竟何謂物件?不同的程式語言以不同的方式定義 物件 某些語言中,它意味著所有 物件必須 有屬性和方法 另一些語言中,它意味...