天天看點

一些概念:同步、異步、協程同步異步

同步

同步:指的一些處理流程在某一時刻/時段内進行順序執行。常見的有線程的同步,這裡的同步是對于線程來說的,因為他們會去通路修改同一部分資源,線程之間在某個時間段内是可以交叉執行,這就有可能造成資料資料混亂,是以這裡了就是需要進行同步的操作,要進行順序執行。可以了解為排隊(通路修改)共享資源,以達到順序的目的,這樣一條隊伍(現實中的隊伍)中的各個線程(軍訓中的人)也就是步調一緻了,同步也就是這麼來了的。

擴充到網絡應用中,對于開啟的單進行單線程 ' tornado的服務 ',每一個時刻隻能處理一個請求,而其他請求就要類似于排隊等待的,也就是同步的進行。假如單個請求處理時間過長,隊伍中的其他所有請求就會需要等待更多時間,這是網絡應用中所不希望的,也就是長時間的處理流程不需要同步,要異步進行,如下。

異步

異步:指的是 在同一時刻/時間段,一些處理流程是并發執行 (并行,同一時刻發生。并發,同一時間段發生),也就是一個時間段内可以處理多個流程。這些流程并不一定是順序進行的(指在這一時間段内),而是存在交叉的的執行的,也就是說一個流程在沒處理完的時候,可以去處理另外一個流程,流程間的步調是不一緻的,也就是不同步,是以就是異步的。

一些自帶同步、異步特性的東西:

線程/程序: 線上程之間或程序之間,預設就是異步的,也就是在一個時間段内,可以有多個線程或是程序執行,這是作業系統賦予的能力。

線程内的程式片段:一些線程内的代碼片段 預設就是順序執行的,也就是某一時間段内隻能執行某一個代碼片,更大的時間段内的多個代碼片是順序執行的,也就是預設的同步。

一些問題:正如上面所講,一些具體的應用中,上面的預設設定并不能滿足玩家的需求!例如:想要多線程處理某些工作,但是在某些地方并不想異步處理。想要提高并發數量,但是呢在某一個時間段内并不想僅僅隻處理一個流程。

是以一些人就開始尋求各種方式進行改變!,是以也就有了一些經典的問題!例如:線程的同步,網絡應用中的異步操作等,下面會進行一些說明。

線程的同步: 如果是想限制 某一個時間片内(處理流程操作時間)(共享位置) 隻能 有有限個處理流程進行處理,,理想的操作時,如果是限制數量是一個的話,就是用鎖,如果限制數量是多個的話就使用信号量。要占用這段時間片/共享位置 的話需要申請 鎖 或信号量,這樣就能限制了同時通路的數量,如果是一個的話,就是同步的了。

網絡應用中的異步(并發的實作):通常有些會預設使用系統提供的并發能力,如上所說,開多個程序,多個程序中開多個線程,以此提高并發能力。然而作業系統資源畢竟有限,一般隻是一個線程内部隻能處理一個流程。如果處理的慢,效果看起來并不理想,是以一些人就想線上程内,模拟作業系統的一些做法,線上程内的處理流程中進行中斷執行(中斷的位置通常是IO的位置),去執行其他操作,以此達到多流程交叉執行的目标,是以就出現了協程的概念,也就是一個線程内的多個程式片段 同時(并發)執行(cpu 還是一個刻隻能處理一個流程的)。

協程:上面已經對其有了描述,這裡要說的是協程 其本質就是将線程内的同步程式進行再次分割,以此達到更小粒度提高并發,提高cpu 的使用率或是網絡中的并發量。這裡的分割,也就是同步程式執行的中斷。下面會有一些例子進行更好的了解:

這裡要有python 的協程的實作,或是一些 庫的使用。

異步,并發:其本質就是将一些I/O (網絡IO、磁盤IO)所用的時間進行重疊,以到達 同一時間段内處理多個任務(這裡CPU處理的真正的時間很短 ,忽略。多個任務處理,即使是并發,總時間也是多于單個任務處理的,這裡是近似相等),

繼續閱讀