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


來源:https://segmentfault.com/q/1010000010018151

參考:https://www.cnblogs.com/lynxcat/p/7954456.html

 

協程可以用在,異步網絡 IO 的時候,使其成為非阻塞的。

比如你在一個 http 請求里面,你需要請求外面的接口,那么會有下面的場景。

你的前置 server 是 nginx,nginx 是非阻塞異步的,但是 php-fpm 是同步阻塞的。那么當你在請求外面接口的時候,這個任務就會被阻塞。(這里補充一下,php-fpm 的 Worker 進程是同步阻塞的)

假設你使用協程,那么當你在請求接口的時候,你的這個任務就可以暫停,保存上下文。然后呢,當你的接口返回了之后,重新調起這個任務繼續執行。你的進程就不必耗在這一個任務上了,可以去處理其它的 http 請求了。這樣是不是並發量就高了?

同理,當你的請求在查詢數據庫的時候,也是一個 IO 請求,也是同步的。協程就可以讓你這些 IO 編程異步非阻塞的,從而增大你的並發量。這主要是讓你的 CPU 可以在等待 IO 的時候,可以處理別的事情。所有的 IO 請求都可以通過協程做到這一點。

你的這篇文章我看過,是很好的一篇文章。這里作者用 yield 實現了一個任務調度,就是干我上面說的那些事情的。你也可以看看鳥哥翻譯的 http://www.laruence.com/2015/...,可以說是對你看到的這個翻譯的一個補充。他通過 yield 實現了一個異步非阻塞的服務器,當然只是一個 demo 啦。有個例子看起來應該會好一點。

 

 

yield的好處:

1.節省內存空間(因為別人的都是一堆數組,貨真價實的一個個的放進內存里,但是yield是迭代器,從頭到尾就只有他一個,相當於替換符號!)

2.協程可以用在,異步網絡 IO 的時候,使其成為非阻塞的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM