登陆

golang - php 通过 yield 实现协程有什么使用场景?

看到一篇文章 PHP 使用协同程序实现合作多任务,讲的是通过 php 的 yield 实现了协程。但是文章太长没有看完,大致看了一下。

# PHP
某草草某草草1573 天前861 次浏览

全部回复(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
  • 取消回复发送