协程可以简单理解为线程,只不过这个线程是用户态的,不需要操作系统参与,创建销毁和切换的成本非常低,和线程不同的是协程没法利用多核 cpu 的,想利用多核 cpu 需要依赖 Swoole 的多进程模型。

上面是协程与进程区别,如果使用协程,没法利用多核CPU,我们现在来实测下 ,获取百度页面5000次
分别采用多协程与多线程模式来进行测试

测试环境:PHP 7.2.3 服务器配置: 1核1G swoole 4.0+

这是两台服务器配置
在这里插入图片描述
首先使用多进程去跑

<?php
use Swoole\Runtime;
use Swoole\Coroutine;
use function Swoole\Coroutine\run;
use Swoole\Process;
$s = microtime(true);
 for ($c = 5000; $c--;) {
     $process = new Process(function () use ($c) {
         if($c == 4999){
             echo microtime(true).'第一次';
         }
         if($c == 1){
             echo microtime(true).'第5000次';
         }
        file_get_contents("http://www.baidu.com");
     });
     $process->start();
 }
echo 'use ' . (microtime(true) - $s) . ' s';

1核2G的服务器
在这里插入图片描述
程序总耗时:68秒 第一个进程被创建到最后一个进程被创建耗时68s
QPS:217

4核8G服务器
在这里插入图片描述
程序总耗时:9.647秒 第一个进程被创建到最后一个进程被创建耗时9.6468s
QPS:520

下面使用协程环境下实现同样代码

<?php
use Swoole\Runtime;
use Swoole\Coroutine;
use function Swoole\Coroutine\run;
use Swoole\Process;

// 此行代码后,文件操作,sleep,Mysqli,PDO,streams等都变成异步IO,见'一键协程化'章节
Runtime::enableCoroutine();
$s = microtime(true);

// Swoole\Coroutine\run()'协程容器'章节
run(function() {
    // 10k pdo and mysqli read
    for ($c = 5000; $c--;) {
        Coroutine::create(function () use ($c){
            if($c == 4999){
                echo '第一次时间:'.microtime(true)."\r\n";
            }
            if($c == 0){
                echo '第5000次时间:'.microtime(true);
            }
            file_get_contents("http://www.baidu.com");
        });
    }

});
echo '程序总耗时:' . (microtime(true) - $s) . ' s'."\r\n";

4核8G服务器
在这里插入图片描述
QPS:14310 程序总耗时:6.84s

1核2G服务器
在这里插入图片描述
QPS:21258 程序总耗时:7.169

这样可以看出来 如果使用协程去执行,创建速度会快很多,基本上QPS可以达到上万的级别
但是协程没办法用到多核。所以在进程使用情况下的话 多核CPU才有作用。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐