回覆列表
  • 1 # 使用者9581387012081

    這是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迴圈,繼續迴圈,直到協程執行完畢。

  • 2 # 藍風24

    一個帶有 yield 的函式就是一個 generator,它和普通函式不同,生成一個 generator 看起來像函式呼叫,但不會執行任何函式程式碼,直到對其呼叫 next()(在 for 迴圈中會自動呼叫 next())才開始執行。雖然執行流程仍按函式的流程執行,但每執行到一個 yield 語句就會中斷,並返回一個迭代值,下次執行時從 yield 的下一個語句繼續執行。看起來就好像一個函式在正常執行的過程中被 yield 中斷了數次,每次中斷都會透過 yield 返回當前的迭代值。

    具體,請參考下以下資料:

    http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

  • 中秋節和大豐收的關聯?
  • 怎麼看印度和俄羅斯蘇57因價格太高,談判徹底破裂,印度決心自己研製隱形戰機呢?