天天看點

php的yield關鍵字相關

PHP 知識補全 —— 生成器 (generator)和協程的實作(基礎)

php 通過 yield 實作協程有什麼使用場景 

填坑之PHP的yield和協程在一起的日子裡(這篇文章寫的非常不錯,很容易了解,我甚至已經轉載到我的部落格了,位址)

這裡,再摘錄一段關于 程序、線程、協程的了解:

先搞清楚,什麼是協程。

你可能已經聽過『程序』和『線程』這兩個概念。

程序就是二進制可執行檔案在計算機記憶體裡的一個運作執行個體,就好比你的.exe檔案是個類,程序就是new出來的那個執行個體。

程序是計算機系統進行資源配置設定和排程的基本機關(排程機關這裡别糾結線程程序的),每個CPU下同一時刻隻能處理一個程序。

所謂的并發,隻不過是看起來CPU好像同時能處理幾件事情一樣,對于單核CPU事實上在用很快的速度切換不同的程序。

程序的切換需要進行系統調用,CPU要儲存目前程序的各個資訊,同時還會使CPUCache被廢掉。

是以程序切換不到非不得已就不做。

那麼怎麼實作『程序切換不到非不得已就不做』呢?

首先程序被切換的條件是:程序執行完畢、配置設定給程序的CPU時間片結束,系統發生中斷需要處理,或者程序等待必要的資源(程序阻塞)等。你想下,前面幾種情況自然沒有什麼話可說,但是如果是在阻塞等待,是不是就浪費了。

其實阻塞的話我們的程式還有其他可執行的地方可以執行,不一定要傻傻的等!

是以就有了線程。

線程簡單了解就是一個『微程序』,專門跑一個函數(邏輯流)。

是以我們就可以在編寫程式的過程中将可以同時運作的函數用線程來展現了。

線程有兩種類型,一種是由核心來管理和排程。

我們說,隻要涉及需要核心參與管理排程的,代價都是很大的。這種線程其實也就解決了當一個程序中,某個正在執行的線程遇到阻塞,我們可以排程另外一個可運作的線程來跑,但是還是在同一個程序裡,是以沒有了程序切換。

還有另外一種線程,他的排程是由程式員自己寫程式來管理的,對核心來說不可見。這種線程叫做『使用者空間線程』。

協程可以了解就是一種使用者空間線程。

協程,有幾個特點:

  • 協同,因為是由程式員自己寫的排程政策,其通過協作而不是搶占來進行切換
  • 在使用者态完成建立,切換和銷毀
  • ⚠️ 從程式設計角度上看,協程的思想本質上就是控制流的主動讓出(yield)和恢複(resume)機制
  • generator經常用來實作協程

說到這裡,你應該明白協程的基本概念了吧?

連結:https://segmentfault.com/a/1190000012457145