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

2022-07-01 05:15:10 字數 742 閱讀 9094

參考:

協程可以用在,非同步網路 io 的時候,使其成為非阻塞的。

比如你在乙個 http 請求裡面,你需要請求外面的介面,那麼會有下面的場景。

你的前置 server 是 nginx,nginx 是非阻塞非同步的,但是 php-fpm 是同步阻塞的。那麼當你在請求外面介面的時候,這個任務就會被阻塞。(這裡補充一下,php-fpm 的 worker 程序是同步阻塞的)

假設你使用協程,那麼當你在請求介面的時候,你的這個任務就可以暫停,儲存上下文。然後呢,當你的介面返回了之後,重新調起這個任務繼續執行。你的程序就不必耗在這乙個任務上了,可以去處理其它的 http 請求了。這樣是不是併發量就高了?

同理,當你的請求在查詢資料庫的時候,也是乙個 io 請求,也是同步的。協程就可以讓你這些 io 程式設計非同步非阻塞的,從而增大你的併發量。這主要是讓你的 cpu 可以在等待 io 的時候,可以處理別的事情。所有的 io 請求都可以通過協程做到這一點。

你的這篇文章我看過,是很好的一篇文章。這裡作者用 yield 實現了乙個任務排程,就是幹我上面說的那些事情的。你也可以看看鳥哥翻譯的 可以說是對你看到的這個翻譯的乙個補充。他通過 yield 實現了乙個非同步非阻塞的伺服器,當然只是乙個 demo 啦。有個例子看起來應該會好一點。

yield的好處:

1.節省記憶體空間(因為別人的都是一堆陣列,貨真價實的乙個個的放進記憶體裡,但是yield是迭代器,從頭到尾就只有他乙個,相當於替換符號!)

2.協程可以用在,非同步網路 io 的時候,使其成為非阻塞的。

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

php 通過 yield 實現協程有什麼使用場景 參考 協程可以用在,非同步網路 io 的時候,使其成為非阻塞的。比如你在乙個 http 請求裡面,你需要請求外面的介面,那麼會有下面的場景。你的前置 server 是 nginx,nginx 是非阻塞非同步的,但是 php fpm 是同步阻塞的。那麼...

yield實現 coroutine協程案例

yield可以手工實現協程,但python為我們封裝了乙個greenlet,先看看yield實現,yield需要手工操作,無法實現io操作時自動切換協程,greenlet是封裝好的,能方便使用io切換!importtime importqueue defconsumer name print sta...

php 協程的實現

協程的實現參考 既然協程效能這麼高,那為什麼使用的還是很少呢,還是其使用場景不是很多,加上協程還是有點不好理解。協程的作用是實施任務排程,由於是程式自己來排程的,那麼會有一些程式惡意的占用cpu,而不會交出cpu控制權 這與系統排程的區別在於,作業系統的排程不管你程式喜不喜歡,該切就切。協程的基礎是...