经常会有人通过QQ或微信向我提一些Swoole开发过程中的一些问题,只要时间允许的情况下,我一般都会做解答,下面列出在Swoole社区里的2个有意思的问题1、Swoole协程的执行顺序?
要了解这个问题,需要先了解下Swoole的基本架构,在Swoole4.x里,我们一般都是采用多进程的模式,一般会有一个master, 一个manager, 多个worker, 大多数的业务逻辑代码都是在worker里去执行
在一个worker里,我们几乎可以随意起多个协程,如下面的代码
for ($i = 0; $i < 4; $i++) { Swoole\Coroutine::Create(function () use ($i) { Swoole\Coroutine::sleep(1); echo "hello $i \n"; });};echo "hello main \n";
那他的执程流程如下:
1、进入for,创建一个协程
2、执行协程的回调函数
3、执行sleep,协程挂起,继续执行循环 1~3
4、循环4次完成,执行 echo 'hello main'
5、sleep 完成,挂起的4个协程依次被唤起,执行 echo 'hello $i'
这里面有几个核心的概念
1、代码是依次执行的
2、协程可以被挂起,(一般碰到i/o,会自动挂起)
3、协程之间唤起没有真正的循序, 先到先得2、Swoole在重启过程中,如何保障请求不丢失
要理解这个问题,先要了解一般的重启作法
1、先stop, 后start
如果是这种,从开始stop,到最后start服务起来,必然会有时间差,如果不做任何措施,必然会丢失这个时间差里的请求,那我们一般可以怎么处理呢?
如果是单实例,这问题无解,所以我们一般要做多实例,然后顺序重启,stop前,可以在前面的proxy里先摘除掉, start成功后,再注册上。这样一般就能保障请求不丢失。现在的很多服务治理会把这个问题考虑进去了
2、reload模式
像nginx, Swoole都支持, 这种的实现机制和一般是发一个信号给master进程,master进程收到这个信号之后,先起一组新的worker接收请求,让现有的worker停止接收新请求,老请求处理完成之后,自动退出。这样就比较
留几个问题,我在Swoole问答等你!!
1、1的执行为什么结果是 0 3 2 1
2、如果把
Swoole\Coroutine::sleep(1);
去掉,结果是啥?
3、上面说的二种重启方式有什么额外的问题?
对了,到这里,就要大大安利下Swoole社区的新动作,Swoole官方问答正式启用,Swoole团队每天都会有一个人专门来负责及时的回答问题。
官方问答地址:https://wenda.swoole.com/
点击阅读原文,把你碰到的相关问题都提到Swoole问答里来吧!!共同把Swoole的社区和生态建立起来!!
最后,科普一下提问的智慧:
尝试在你准备提问论坛的历史文档中搜索答案
尝试搜索互联网以找到答案
尝试阅读手册以找到答案
尝试阅读“常见问题文档”(FAQ)以找到答案
尝试自己检查或试验以找到答案
尝试请教懂行的朋友以找到答案
切记抛出文档里有明确解释的问题、也切记抛出太开放性的问题,问题最好能专一、且有上下文!!
Swoole问答欢迎您!!!
----------伟大的分割线-----------
PHP饭米粒(phpfamily) 由一群靠谱的人建立,愿为PHPer带来一些值得细细品味的精神食粮!
饭米粒只发原创或授权发表的文章,不转载网上的文章
所发的文章,均可找到原作者进行沟通。
也希望各位多多打赏(算作稿费给文章作者),更希望大家多多投稿。
投稿请联系:
shenzhe163@gmail.com
本文由 桶哥 授权 饭米粒 发布,转载请注明本来源信息和以下的二维码(长按可识别二维码关注)