php 協程理解

2022-09-11 22:54:29 字數 947 閱讀 3651

生成器生成器最基本的思想也是乙個函式,這個函式的返回值是依次輸出,而不是只返回乙個單獨的值。或者,換句話說,生成器使你更方便的實現了迭代器介面。下面通過實現乙個xrange函式來簡單說明:

<?php

function xrange($start, $end, $step = 1)

}foreach (xrange(1, 1000000) as $num)

生成器為可中斷的函式

要從生成器認識協同程式,理解它們內部是如何工作的非常重要:生成器是可中斷的函式,在它裡面,yield構成了中斷點。

協程協程給上面功能新增的主要東西是回送資料給生成器的能力。這將把生成器到呼叫者的單向通訊轉變為兩者之間的雙向通訊。

用send 將資料給函式

<?php

function gen()

$gen = gen();

var_dump($gen->current());    // string(6) "yield1"

var_dump($gen->send('ret1')); // string(4) "ret1"   (the first var_dump in gen)

// string(6) "yield2" (the var_dump of the ->send() return value)

var_dump($gen->send('ret2')); // string(4) "ret2"   (again from within gen)

// null               (the return value of ->send())

使用協程主要是實現多工工作。

這個時候你應當明白協程和任務排程之間的聯絡:yield指令提供了任務中斷自身的一種方法,然後把控制傳遞給排程器。因此協程可以執行多個其他任務。更進一步來說,yield可以用來在任務和排程器之間進行通訊。

生成器-任務-排程器 

python 協程 理解

協程的使用依賴於gevent 它封裝了greenlet 在使用的時候 主要是切斷當前程式執行,然後當收到訊號再次執行程式。在中斷中可以進行其它任務。程式import gevent def foo print running in foo gevent.sleep 0 print explicit c...

golang 協程理解

本文總結一下go協程的理解,如有錯誤望請指正。網上都說協程是一種輕量級執行緒,執行緒又是一種輕量級的程序。這話在語言層面看來是沒有錯的,但它們的實現是不同的。執行緒是cpu資源排程的最小單位。協程不由cpu進行排程,由應用程式進行排程,也就是由go進行排程。在go中,協程的排程也有專門的排程器。但g...

對協程的理解

對於作業系統來說,協程其實是一種特殊的執行緒,對於cpu來說,協程是非搶占式 程序和執行緒是搶占式的 實現機理如下 有兩個function a,b,a呼叫b,b要執行一段時間,很晚才返回,a不會因為等b而一直占用cpu,即a是非阻塞的。b返回後,a又能繼續執行。神奇的是,a和b又是走在一條獨木橋 橋...