golang - php 透過 yield 實現協程有什麼使用場景?
某草草
某草草 2017-07-03 11:40:23
0
3
1597

看到一篇文章 PHP 使用協同程式實現合作多任務,講的是透過 php 的 yield 實現了協程。但是文章太長沒看完,大致看了一下。

  • PHP 的協程在專案中何時會用上?

  • 或有沒有適用的場景?

  • 目前有對其封裝的函式庫嗎?

某草草
某草草

全部回覆(3)
Ty80

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

例如你在一個 http 請求裡面,你需要請求外面的接口,那麼會有下面的場景。

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

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

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

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

仅有的幸福

目前我遇到的,看到laravel框架model以遊標方式取資料時,用的是yield來防止一次性取資料太多導致記憶體不足的問題

某草草

最基礎的是導入或導出大量資料到excel,假設導出/導出過程需要對資料進行處理一下,這個時候可以用。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板