面試官問你php協程,你要這樣告訴他

2021-10-02 14:29:52 字數 2560 閱讀 2587

多工 (並行和併發)在講協程之前,先談談多程序、多執行緒、並行和併發。

對於單核處理器,多程序實現多工的原理是讓作業系統給乙個任務每次分配一定的 cpu 時間片,然後中斷、讓下乙個任務執行一定的時間片接著再中斷並繼續執行下乙個,如此反覆。

由於切換執行任務的速度非常快,給外部使用者的感受就是多個任務的執行是同時進行的。

多程序的排程是由作業系統來實現的,程序自身不能控制自己何時被排程,也就是說: 程序的排程是由外層排程器搶占式實現的

而協程要求當前正在執行的任務自動把控制權回傳給排程器,這樣就可以繼續執行其他任務。這與搶占式的多工正好相反, 搶占多工的排程器可以強制中斷正在執行的任務, 不管它自己有沒有意願。如果僅依靠程式自動交出控制的話,那麼一些惡意程式將會很容易占用全部 cpu 時間而不與其他任務共享。

協程的排程是由協程自身主動讓出控制權到外層排程器實現的

回到剛才生成器實現 xrange 函式的例子,整個執行過程的交替可以用下圖來表示:

協程可以理解為純使用者態的執行緒,通過協作而不是搶占來進行任務切換。

相對於程序或者執行緒,協程所有的操作都可以在使用者態而非作業系統核心態完成,建立和切換的消耗非常低。

簡單的說協程 就是提供一種方法來中斷當前任務的執行,儲存當前的區域性變數,下次再過來又可以恢復當前區域性變數繼續執行。

我們可以把大任務拆分成多個小任務輪流執行,如果有某個小任務在等待系統 io,就跳過它,執行下乙個小任務,這樣往復排程,實現了 io 操作和 cpu 計算的並行執行,總體上就提公升了任務的執行效率,這也便是協程的意義多執行緒在單核下,多執行緒必定是併發的;

不過現在的統一程序的多執行緒是可以執行在多核cpu下,所以可以是並行的併發(concurrency)是指能處理多個同時性活動的能力,併發事件之間不一定要同一時刻發生。並行(parallesim)是指同時發生的兩個併發事件,具有併發的含義,而併發則不一定並行。

多個操作可以在重疊的時間段內進行。並行和併發區別併發指的是程式的結構,並行指的是程式執行時的狀態

並行一定是併發的,並行是併發設計的一種

單執行緒永遠無法達到並行狀態協程協程的支援是在生成器的基礎上, 增加了可以回送資料給生成器的功能(呼叫者傳送資料給被呼叫的生成器函式).

這就把生成器到呼叫者的單向通訊轉變為兩者之間的雙向通訊.

同步**

在沒有涉及到非同步執行**之前,我們的**都是這樣的

function printnum($max, $caller)

}printnum(3, "caller1");

printnum(3, "caller2");

# output

排程者:caller1  列印:0

排程者:caller1  列印:1

排程者:caller1  列印:2

排程者:caller2  列印:0

排程者:caller2  列印:1

排程者:caller2  列印:2

使用協程後改進的**

初稿,手動調整生成器執行

# 本**手動調整了程序執行**的順序,當然本**實現不用協程也可以,只是利用本流程說明協程作用

# 生成器給了我們函式中斷,協程[生成器send]給了我們重新喚起生成器函式的能力

function printnumwithgen($max)

}$gen1 = printnumwithgen(3);

$gen2 = printnumwithgen(3);

// 手動執行caller1 再 caller2

$gen1->send("排程者: caller1 列印:" . $gen1->current() . php_eol);

$gen2->send("排程者: caller2 列印:" . $gen2->current() . php_eol);

// 手動執行caller1 再 caller2

$gen1->send("排程者: caller1 列印:" . $gen1->current() . php_eol);

$gen2->send("排程者: caller2 列印:" . $gen2->current() . php_eol);

// 手動執行caller2 再 caller1

$gen2->send("排程者: caller2 列印:" . $gen2->current() . php_eol);

$gen1->send("排程者: caller1 列印:" . $gen1->current() . php_eol);

# output

排程者: caller1 列印:0

排程者: caller2 列印:0

排程者: caller1 列印:1

排程者: caller2 列印:1

排程者: caller2 列印:2

排程者: caller1 列印:2

總結

上面案例應該讓大家理解了協程設計的意義和如何使用協程

那麼接下去我們為我們的協程自動乙個自動排程器(co自動執行器),無需再手動來中斷和恢復了

摘錄 面試官也許會這樣問你

回答樣本一 我對工資沒有硬性要求,我相信貴公司在處理我的問題上會友善合理。我注重的是找對工作機會,所以只要條件公平,我則不會計較太多。回答樣本二 我受過系統的軟體程式設計的訓練,不需要進行大量的培訓,而且我本人也對程式設計特別感興趣。因此,我希望公司能根據我的情況和市場標準的水平,給我合理的薪水。回...

面試官問你HTTP狀態碼,你敢答嗎?

2021.04.19 更新,新增對 304 狀態碼的描述。http狀態碼的作用是告知客戶端,從伺服器端返回的請求結果。聽說面試會問http狀態碼,相比那些神仙操作,這個記憶性的知識點準備起來比較容易,不應該成為丟分項。本文參考了網上的資料列舉了常見的http狀態碼,如果接下來面試或者看面經有遇到的這...

面試官問這6個問題,你要警惕!

先做個自我介紹吧 談談你的優缺點 你打算怎麼開展工作 你的興趣愛好是什麼 這些問題在不少求職者看來都很傻很天真,難道我回答了面試官就真信了?根據前程無憂論壇 bbs.51job.com 近期就 最讓人反感的面試題 為主題進行的調查結果顯示,們最反感在面試時被問到自己的缺點,其次就是自我介紹,而離職原...