Python中的同步、非同步、阻塞和非阻塞是什麼?

王林
發布: 2023-04-24 09:37:07
轉載
1494 人瀏覽過

    一、狀態介紹

    在了解其他概念之前,我們先要了解行程的幾個狀態。在程式運行的過程中,由於被作業系統的調度演算法控制,程式會進入幾個狀態:就緒,運行和阻塞。

    • 就緒(Ready)狀態:當進程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的進程狀態稱為就緒狀態。

    • 執行/運行(Running)狀態當進程已獲得處理機,其程式正在處理機上執行,此時的進程狀態稱為執行狀態。

    • 阻塞(Blocked)狀態正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。造成進程阻塞的事件可有多種,例如,等待I/O完成、申請緩衝區無法滿足、等待信件(訊號)等。

    二、同步與非同步

    所謂異步是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務無法確定,所以它是不可靠的任務序列。

    範例

    • 第一種:選擇排隊等候;

    • 第二種:選擇取一個小紙條上面有我的號碼,等到排到我這一號時由櫃檯的人通知我輪到我去辦理業務了;

    第一種:前者(排隊等候)就是同步等待訊息通知,也就是我要一直在等待銀行辦理業務狀況;

    第二種:後者(等待別人通知)就是異步等待訊息通知。在非同步訊息處理中,等待訊息通知者(在這個例子中就是等待辦理業務的人)往往註冊一個回調機制,在所等待的事件被觸發時由觸發機制(在這裡是櫃檯的人)通過某種機制(這裡是寫在小紙條上的號碼,喊號)找到等待事件的人。

    三、阻塞和非阻塞

    例子

    繼續上面的那個例子,不論是排隊還是使用號碼等待通知,如果在這個等待的過程中,等待者除了等待訊息通知之外不能做其它的事情,那麼該機制就是阻塞的,表現在程式中,也就是該程式一直阻塞在該函數呼叫處不能繼續往下執行。

    相反,有的人喜歡在銀行辦理這些業務的時候一邊打打電話發短信一邊等待,這樣的狀態就是非阻塞的,因為他(等待者)沒有阻塞在這個消息通知上,而是一邊做自己的事情一邊等待。

    注意:同步非阻塞形式其實是效率低的,想像你一邊打著電話一邊還需要抬頭看到底隊伍排到你了沒有。如果把打電話和觀察排隊的位置看成是程序的兩個操作的話,這個程序需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的;而異步非阻塞形式卻沒有這樣的問題,因為打電話是你(等待者)的事情,而通知你則是櫃檯(消息觸發機制)的事情,程序沒有在兩種不同的操作中來回切換。

    四、同步/非同步與阻塞/非阻塞

    1.非同步阻塞形式

    如果在銀行等待辦理業務的人採用的是異步的方式去等待訊息被觸發(通知),也就是領了一張小紙條,假如在這段時間裡他不能離開銀行做其它的事情,那麼很顯然,這個人被阻塞在了這個等待的操作上面。

    非同步操作是可以被阻塞住的,只不過它不是在處理訊息時阻塞,而是在等待訊息通知時被阻塞。

    2.同步非阻塞形式

    想像一下你一邊打著電話一邊還需要抬頭看到底隊伍排到你了沒有,如果把打電話和觀察排隊的位置看成是程序的兩個操作的話,這個程序需要在這兩種不同的行為之間來回的切換,效率可想而知是低的。

    3.非同步非阻塞形式

    因為打電話是你(等待者)的事情,而通知你則是櫃檯(訊息觸發機制)的事情,程式沒有在兩種不同的操作中來回切換。

    比如說,這個人突然發覺自己煙癮犯了,需要出去抽根煙,於是他告訴大堂經理說,排到我這個號碼的時候麻煩到外面通知我一下,那麼他就沒有被阻塞在這個等待的操作上面,自然這個就是非同步非阻塞的方式了。

    以上是Python中的同步、非同步、阻塞和非阻塞是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板