加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

分析php协程知识点

发布时间:2022-07-02 17:09:48 所属栏目:PHP教程 来源:互联网
导读:多任务 (并行和并发) 在讲协程之前,先谈谈多进程、多线程、并行和并发。 对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。 协程的
  多任务 (并行和并发)
 
  在讲协程之前,先谈谈多进程、多线程、并行和并发。
 
  对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。
 
 
  协程的调度是由协程自身主动让出控制权到外层调度器实现的
 
  回到刚才生成器实现 xrange 函数的例子,整个执行过程的交替可以用下图来表示:
 
  协程可以理解为纯用户态的线程,通过协作而不是抢占来进行任务切换。
 
  相对于进程或者线程,协程所有的操作都可以在用户态而非操作系统内核态完成,创建和切换的消耗非常低。
 
  简单的说协程 就是提供一种方法来中断当前任务的执行,保存当前的局部变量,下次再过来又可以恢复当前局部变量继续执行。
 
  我们可以把大任务拆分成多个小任务轮流执行,如果有某个小任务在等待系统 IO,就跳过它,执行下一个小任务,这样往复调度,实现了 IO 操作和 CPU 计算的并行执行,总体上就提升了任务的执行效率,这也便是协程的意义
 
  多线程
 
  在单核下,多线程必定是并发的;
 
  不过现在的统一进程的多线程是可以运行在多核CPU下,所以可以是并行的
 
  并发(Concurrency)
 
  是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。
 
  协程
 
  协程的支持是在生成器的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数).
 
  这就把生成器到调用者的单向通信转变为两者之间的双向通信.
 
  我们在上篇文章已经讲过了send方法, 下面让我们理解下协程
 
  同步代码
 
  在没有涉及到异步执行代码之前,我们的代码都是这样的
 
  function printNum($max, $caller)
  {
    for ($i=0; $i<$max; $i++ ) {
      echo "调度者:" . $caller . " 打印:" . $i . PHP_EOL;
    }
  }
     
  printNum(3, "caller1");
  printNum(3, "caller2");
     
  # output
  调度者:caller1 打印:0
  调度者:caller1 打印:1
  调度者:caller1 打印:2
  调度者:caller2 打印:0
  调度者:caller2 打印:1
  调度者:caller2 打印:2
  使用协程后改进的代码
 
  初稿,手动调整生成器执行
 
  # 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用
 
  # 生成器给了我们函数中断,协程[生成器send]给了我们重新唤起生成器函数的能力
 
  function printNumWithGen($max)
  {
    for ($i=0; $i<$max; $i++ ) {
      $res = yield $i;
      echo $res;
    }
  }
     
  $gen1 = printNumWithGen(3);
  $gen2 = printNumWithGen(3);
     
  // 手动执行caller1 再 caller2
  $gen1->send("调度者: caller1 打印:" . $gen1->current() . PHP_EOL);
  $gen2->send("调度者: caller2 打印:" . $gen2->current() . PHP_EOL);
     
   # output
  调度者: caller1 打印:0
  调度者: caller2 打印:0
  调度者: caller1 打印:1
  调度者: caller2 打印:1
  调度者: caller2 打印:2
  调度者: caller1 打印:2
  总结:
 
  上面案例应该让大家理解了协程设计的意义和如何使用协程
 
  那么接下去我们为我们的协程自动一个自动调度器(Co自动执行器),无需再手动来中断和恢复了。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读