Tp6+Swoole搭建,测试协程与异步差距

6 篇文章 1 订阅

由于部门的一个项目,用到了TP6+Swoole的方式重构,想偷偷师,所以自己也搭一个玩玩,最后有测试代码及结果。

首先,我们先拉取PHP的镜像,用到的是7.3-cli,7.4有坑,不推荐用。

docker pull php:7.3-cli

拉好之后,启动容器,命名为swoole,映射端口80,挂载一个空目录,tp6

docker run -it --name swoole -p 8080:80 -v D:\www\tp6:/code/tp6 php:7.3-cli

接下来安装swoole扩展,需要用到wget,所以先安装wget,然后下载源码的包下来

apt-get update
apt-get install wget
#下载swoole源码
wget https://github.com/swoole/swoole-src/archive/v4.6.4.tar.gz

下好之后,解压,然后cd到目录中,执行下面代码

cd swoole-src && \
phpize && \
./configure && \
make && sudo make install

接下来下载安装composer,因为TP6需要用到composer,直接全局安装方式

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

安装好之后,来到tp6的路径,拉取tp6框架,然后再拉取think-swoole

composer create-project topthink/think=6.0.x-dev tp6
#接着到根目录,安装swoole支持
cd tp6
composer require topthink/think-swoole

接着修改一下swoole.conf,再拉取完think-swoole模块后,会在config目录多出一个swoole.conf文件

#将127.0.0.1改成0.0.0.0
'host'      => env('SWOOLE_HOST', '0.0.0.0'), // 监听地址

因为是在容器里面运行的,所以不能用127.0.0.1,得用 0.0.0.0,这样宿主机才能访问成功

接下来,我们写一个协程测试接口

public function test() {
        echo date('Y-m-d H:i:s') . '--start..' . '<br/>';
        $result = [];
        for ($i = 1; $i <= 3; $i++) {
            $result[] = $i;
            sleep(1);
        }

        for ($n = 11; $n <= 13; $n++) {
            $result[] = $n;
            sleep(1);
        }
        echo date('Y-m-d H:i:s') . '--done..' . PHP_EOL;
        dump($result);
    }

public function testHook() {
        echo date('Y-m-d H:i:s') . '--start..' . '<br/>';
        $result = [];
        $wg = new WaitGroup();
        $wg->add();
        go(function() use($wg, &$result){
            for ($i = 1; $i <= 3; $i++) {
                $result[] = $i;
                sleep(1);
            }
            $wg->done();
        });

        $wg->add();
        go(function () use($wg, &$result) {
            for ($n = 11; $n <=  13; $n++) {
                $result[] = $n;
                sleep(1);
            }
            $wg->done();
        });
        $wg->wait();
        echo date('Y-m-d H:i:s') . '--done..' . PHP_EOL;
        dump($result);
    }

结果对比

                                

可以看到,协程方式的执行时间只有3S,输出的是1,11,2,12,13,3,和同步结果是不一样的,这就是协程的魅力。

 

PS:2021-03-25,最近在弄异步Http的东西,由于项目较旧,无法升级swoole,但PHP有个扩展guzzle,可以发起异步http,于是对比了一下两者之间的差别。

场景:发起3次http请求,测试接口sleep1秒,结果图

                            

可以看出,其实异步和协程速度差异不大,同步则是最拉跨的,但是!!!!

当我把调用次数调高了,就会发现异步还是打不过协程。

场景:发起5次http请求,测试接口sleep1秒,结果图

                      

可以发现,异步的时间去到了2S,是协程的2倍,这是为什么呢,这是因为异步的原理是fork多个子线程去处理任务,当线程资源用完了,还是得排队等待资源释放。

为什么协程还是这么快呢,因为协程是轻量级线程,协程也是属于线程,协程是在线程里执行的。协程的调度是用户手动切换的,所以又叫用户空间线程。协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。

一个协程默认分配8K内存,假设我们在协程中执行的代码使用的栈内存,不超过8K,那么1G的内存大约可以创建多少个协程呢?1G= 1024MB = (1024 * 1024)KB, max_coroutine_num = 1024 * 1024 / 8 = 130072。也就是说1G内存就可以创建10w+的协程数量。相当的可观。

协程的调度策略是:协作式调度;协作式调度指的是,当一个协程遇到IO阻塞,会挂起,让另一个协程调度资源,而且因为协程很轻量级,切换速度非常快,很适合用于IO高并发场景。

当我把请求数大幅的调到100时

也只是去到1.17秒,不得不叹服协程的性能。

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值