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停止接收新请求,老请求处理完成之后,自动退出。

最后,科普一下提问的智慧:

  • 尝试在你准备提问论坛的历史文档中搜索答案

  • 尝试搜索互联网以找到答案

  • 尝试阅读手册以找到答案

  • 尝试阅读“常见问题文档”(FAQ)以找到答案

  • 尝试自己检查或试验以找到答案

  • 尝试请教懂行的朋友以找到答案

切记抛出文档里有明确解释的问题、也切记抛出太开放性的问题,问题最好能专一、且有上下文!!