yield 是什嗎?

來源:互聯網
上載者:User

回複內容:

這是php實現協程的方式。

要理解協程,首先要理解:代碼是代碼,函數是函數。函數包裹的代碼賦予了這段代碼附加的意義:有參數,有傳回值,當函數調用另個函數的時候,必須等這個函數返回,當前函數才能返回,這就構成了後進先出,也就是stack。

而協程包裹的代碼,不是函數,不完全遵守函數的這些附加的意義,協程執行到某個點,他yield,而不是return,再次調用協程的時候,會在上次yeild的點繼續執行。

所以攜程違背了通常作業系統和x86的cpu認定的代碼執行方式,也就是stack的這種執行方式,需要運行環境(比如php,python的yield和golang的goroutine)自己調度,來實現你所要求的這種代碼執行的語義。

具體來說,一個包含yeild的php函數,就是協程,他有階段性的結算值 yield $var, 但是代碼並不返回,php的調度者接到這個值後,餵給一個generator,generator是個實現了iterator介面的+和協程通訊介面(比如send方法)的執行個體,所以可以用在for迴圈裡(另個介面負責和協程通訊)。那麼gnenerator收到了這個協程的階段性的值後,他餵給for迴圈,等for迴圈下一次迴圈的時候,他又啟動這個協程,協程從上次中斷的點繼續執行,繼續計算,繼續yeild值給generator,generator喂for迴圈,繼續迴圈,直到協程執行完畢。上面兩位兄台所說的yield是其作為generator的用法,也就是yield作為語句的時候。當yield當作運算式用的時候,那就是“協程”的用法了。具體請看:PHP 使用協同程式實現合作多任務 含有yield關鍵字的函數被調用時候和普通函數不同,他不執行函數代碼,而是返回一個generator對象,這個對象是可迭代對象,具有next()方法,調用一次next方法執行到yield那裡的時候暫停一下,返回一次計算的值(用法類似return),當再次調用next()方法時,接著yield下面代碼迴圈執行知直到又碰到yield,返回下一個迴圈計算的值。。。這樣不就動態產生值了麼,一次一個不佔記憶體。碰到這個詞的時候大概就是告訴程式,來我要產生個generator對象並返回了。中文文檔PHP: 產生器總覽
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.