首頁  >  問答  >  主體

golang - php 透過 yield 實現協程有什麼使用場景?

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

某草草某草草2685 天前1584

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-07-03 11:42:23

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

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

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

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

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

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

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-07-03 11:42:23

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

    回覆
    0
  • 某草草

    某草草2017-07-03 11:42:23

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

    回覆
    0
  • 取消回覆