php中執行緒、協程的理解
#1、執行緒
執行緒也叫輕量級進程,它是一個基本的CPU執行單元,也是程式執行過程中的最小單元,由執行緒ID、程式計數器、暫存器集合和堆疊共同組成。執行緒的引入減少了程式並發執行時的開銷,提高了作業系統的並發效能。線程沒有自己的系統資源。
線程較之進程,其優勢在於一個快,不管是創建新的線程還是終止一個線程;不管是線程間的切換還是線程間共享資料或通信,其速度與進程相比都有較大的優勢。
執行緒的出現是為了降低上下文切換的消耗,提高系統的並發性,並突破一個進程只能做一樣事的缺陷,使到進程內並發成為可能。
2、協程
協程就是使用者狀態的線程,要理解是什麼是“使用者狀態的線程”,必然就要先理解什麼是「內核態的線程」。內核態的線程是由作業系統來進行調度的,在切換線程上下文時,要先保存上一個線程的上下文,然後執行下一個線程,當條件滿足時,切換回上一個線程,並恢復上下文。協程也是如此,只不過,使用者態的執行緒不是由作業系統來調度的,而是由程式設計師來調度的,是在使用者態的。
yield
這個關鍵字就是用來產生中斷,並保存目前的上下文的,比如說程式的一段程式碼是存取遠端伺服器,那這個時候CPU就是空閒的,就用yield讓出CPU,接著執行下一段的程式碼,如果下一段程式碼還是存取除CPU以外的其它資源,還可以呼叫yield讓出CPU. 繼續往下執行,這樣就可以用同步的方式寫異步的程式碼了。
①協程的出現
在協程出現之前,要實現多任務並發,在無OS(作業系統)時代,可以使用狀態機的想法對多任務進行拆解,在單一進程環境中執行多任務,但是這種模式下需要開發者對每個任務有清楚的了解,也要開發者自行開發與任務相關功能(如任務間的通訊)。
後來出現了OS(作業系統),咱們就開始使用OS提供的進程和執行緒功能來輕易實現多任務了。在OS中,程的上下文切換是OS核心控制。但後來卻出現了一個問題,頻繁的進程上下文切換導致了OS效能的降低(主要是短時執行消耗小的任務進程)。
為了解決這個問題,開始提出新的概念,就是在同一進程或執行緒中執行多個任務,這種問題就相當於回到了早期的無OS時代的多任務實作。而現在解決方案稱為協程。其本質是,將任務切換的部分工作從核心轉移到應用層。
②php中協程的基本工具以及基本使用
要實現協程,php給出了兩個新東西:生成器和yield關鍵字。
(1)什麼是生成器?
生成器繼承了實作了迭代器,在php程式碼中和函數的定義類似,不過內部使用了yield關鍵字,如:
使用時,這樣子:
好了,這樣使用代表什麼意思呢?
(1)首先$my_gen = gen();這句程式碼只是實例化一個新的生成器,裡面的程式碼並未執行;
(2)$my_gen->current();這句程式碼就執行了生成器裡面的step2中的yield “gen1”了,這時程式碼中斷,並且字串“gen1”被傳入了生成器$my_gen,並且作為current()函數的回傳值;
這裡如果繼續用current()方法來調取,則結果也不變,$my_gen的回傳值仍然是gen1
(3)send(“main send”)執行完之後,字串”main send”被傳遞進了生成器$my_gen, 同時生成器作為step2中yield的返回值傳遞給ret; 透過send()方法則會找到先前的上下文,並繼續向下走。
(4) 生成器step3執行完後,在step4時,遇到yield就會再次進入中斷。
以上內容僅供參考!
推薦教學:PHP影片教學
以上是php線程協程怎麼理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!