來源: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 的時候,使其成為非阻塞的。