请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于协程问题小伙伴请关注下

11.1号本课程针对swoole做了一次升级,将swoole2.x升级到swoole4.4.8,关于本节小伙伴和我反馈本节没太理解,那么我想通过写这篇文章的方式来帮助其他困惑的小伙伴,或者仔细看 6-17 节协程化redis一些问题的思考这一节, 希望对大家有帮助,也欢迎大家留言

我先贴下课程代码 a.php

go(function () {     //   s1
    co::sleep(1);    //   s2
    //sleep(1);      //   s3
    echo "协程1".PHP_EOL; // s7
});

echo "singwa swoole".PHP_EOL;  // S4

Swoole\Coroutine::create(function () {     // s5
    echo "协程2".PHP_EOL; // s6
});


我们知道当我们PHP执行a.php的时候,这个时候系统开启了一个进程, 然后程序执行到 上图 s1的时候,我们得进程会开一个协程, 这个协程当走到s2的时候 ,因为co::sleep这个其实是堵塞的,并且这个是一个协程sleep, 那么他会交出协程控制权,那么你就可以理解这个协程会让出他的调度权,然后就暂时先不执行本协程下面的代码,在这个过程我们可以得出一个结论:  协程 客户端遇到 堵塞IO的时候 会交出本次调度权给其他协程,从而实现了协程非堵塞IO (达到了非堵塞IO的效果), 然后进程继续走到s4 输出内容, 再走到s1让出的协程控制权交给的s5, s5协程最终输出  协程2

从而输出  :

singwa swoole

协程2

协程1



当我们得程序开启了 sleep

go(function () {     //   s1
    //co::sleep(1);    //   s2
    sleep(1);      //   s3
    echo "协程1".PHP_EOL; // s7
});

echo "singwa swoole".PHP_EOL;  // S4

Swoole\Coroutine::create(function () {     // s5
    echo "协程2".PHP_EOL; // s6
});

同样的道理进程先开启一个协程s1 , 然后走到s3的sleep ,因为sleep是堵塞的,并且不是协程client, 这个堵塞IO 必须等他执行完毕之后方可执行下面,因为他不会交出协程控制权,他没有这个魄力或者说能力,所以他循序执行

输出:

协程1

singwa swoole

协程2


所以从上面我们可以看出协程可以减少IO堵塞从而提升性能


备注:本章会有 小15个视频内容更新,下周会陆续发布,请小伙伴耐心等待!


正在回答 回答被采纳积分+3

3回答

提问者 singwa 2019-11-02 01:49:50

小伙伴们请关注。

2 回复 有任何疑惑可以回复我~
hen_nam 2021-03-03 21:59:28

协程必须在协程容器里面创建

https://wiki.swoole.com/#/coroutine/scheduler


Swoole\Coroutine\run(function () {

Swoole\Coroutine::create(function () {

......
});

});

1 回复 有任何疑惑可以回复我~
慕少5137873 2019-11-02 10:31:04

明白了!这个讲的比较简单明了

0 回复 有任何疑惑可以回复我~
  • 提问者 singwa #1
    哈哈,赞赞赞
    回复 有任何疑惑可以回复我~ 2019-11-02 11:08:28
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信