Swoole协程与传统fpm同步模式比较

如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP。那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用。

首先,Swoole 只能运行在命令行(Cli)模式下,所以我们开发调试都是使用命令行,而不是 php-fpm/apache 等。

在 Swoole 中,我们可以使用`\Swoole\Coroutine::create()`创建协程,或者你也可以使用简写`go()`。

初识 Swoole 协程

go(function(){

    go(function(){

        echo 0, PHP_EOL;

    });

    echo 1, PHP_EOL;

});

go(function(){

    echo 2, PHP_EOL;

});

go(function(){

    echo 3, PHP_EOL;

});

执行结果:

0

1

2

3

Swoole 协程与同步模式比较

我们一直在说 Swoole 协程适合用于 I/O 密集场景,在同样的硬件配置环境下,它会比传统的同步模式承载更多的访问量。

我们熟悉的文件读写、网络通讯请求(MySQL、Redis、Http等)都是属于 I/O 密集型场景。

假设一次 SQL 查询为 100ms,在传统同步模式下,当前进程在这 100ms 的时间里,是不能做其它操作的。如果要执行十次这个 SQL,可能需要耗费 1s 以上。

而如果用协程,虽然不同协程之间也是按顺序执行,但是在前一个等待 100ms 期间,底层会调度 CPU,去执行其它协程的操作。也就是说,可能第一个查询还没返回结果,其它几个查询就已经发送给了 MySQL 并正在执行中了。如果开启十个协程,分别执行这个 SQL,可能只需要耗费 100+ms 即可完成。

测试代码如下:

Swoole\Runtime::enableCoroutine(); // 开启一键协程化

function work()

{

    $pdo = new \PDO(‘mysql:host=127.0.0.1;dbname=db_test‘, ‘root‘, ‘root‘);

    $pdo->exec(‘select SLEEP(0.1)‘); // 模拟sql需要执行 100ms 的情况

}

$time = microtime(true);

for($i = 0; $i < 10; ++$i)

{

    work();

}

echo ‘time: ‘, (microtime(true) - $time), ‘s‘, PHP_EOL;

$time = microtime(true);

for($i = 0; $i < 10; ++$i)

{

    go(‘work‘);

}

swoole_event_wait(); // 等待所有协程执行完

echo ‘time: ‘, (microtime(true) - $time), ‘s‘, PHP_EOL;

执行结果:

time: 1.0326268672943s

time: 0.10734605789185s

上面的代码可以假想为,单进程处理 10 个请求所需的时间。每个请求需要执行一次耗费 100ms 的 SQL 语句。

同步模式,耗费 1s 左右的是 fpm。可以看出,在等待 100ms 期间是不能做任何事情的。

协程模型,耗费 0.1s 左右的是 Swoole。在等待 100ms 期间会挂起当前协程,底层调度会让 CPU 去执行其它协程的操作。

以上就是Swoole协程与传统fpm同步模式比较的详细内容

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处

推荐阅读:

八重樱:Swoole协程与Go协程的区别,很详细,很牛逼?

原文地址:https://www.cnblogs.com/a609251438/p/12078363.html

时间: 2024-10-06 22:27:25

Swoole协程与传统fpm同步模式比较的相关文章

Swoole 协程工作池 swoole-co-pool

介绍 Swoole 协程工作池,它可以限定你的同时工作协程数量,并且减少协程频繁创建销毁的损耗. 原理 事先定好协程数量和工作队列长度,将所有工作协程事先创建好. 使用 Swoole\Coroutine\Channel 实现工作队列. 在每个工作协程中,Swoole\Coroutine\Channel->pop().一旦有新的任务 push 进队列,就会有一个工作协程被唤醒. 安装 在您的composer.json中加入配置:                                   

windows下多进程加协程并发模式

好久没更新博客了.正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得.如标题所示,今天就来说说windows下多进程加协程并发模式.其实网上还是蛮多在linux下的多进程加协程并发模式,本身linux对python的支持更好吧.但是由于本人的开发环境是windows的,而且网上关于这方面的资料还是少了一点,不过经过一番折腾,也算是弄出来了.废话不多说,先贴代码吧: # coding=utf-8 # windows下多进程加协程并发模式 # 打入gevent的monkey补丁

FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架

用过go erlang gevent的亲们应该都会知道协程在应用中带来的方便. 如果对协程不理解的同学,通过阅读下面例子可以快速了解我们框架的协程的意义,已了解的可以跳过这部分. 协程例子:假设我们要发个Get请求获取百度首页内容: php同步方式:$result = file_get_contents("http://www.baidu.com"), php果然是世界上最好的语言,多么简洁. 然后java和c++的同学开始不屑了: "呵呵, 同步,鄙视你不解释."

PHP 协程:Go + Chan + Defer

Swoole4为PHP语言提供了强大的CSP协程编程模式.底层提供了3个关键词,可以方便地实现各类功能. Swoole4提供的PHP协程语法借鉴自Golang,在此向GO开发组致敬 PHP+Swoole协程可以与Golang很好地互补.Golang:静态语言,严谨强大性能好,PHP+Swoole:动态语言,灵活简单易用 本文基于Swoole-4.2.9和PHP-7.2.9版本 关键词 go :创建一个协程 chan :创建一个通道 defer :延迟任务,在协程退出时执行,先进后出 这3个功能底

Lua中协程的使用

平常访问网络都会使用回调的方式,现在通过协程改变这种回调的模式,让异步方法按同步的方法来使用 -- co.lua yield = coroutine.yield co = function(func, cb) local cor = coroutine.create(func) local next = coroutine.resume local hasNext; hasNext = function(status, func, ...) -- suspended if not status

15.python并发编程(线程--进程--协程)

一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完成(2)数据集:是程序在执行过程中所需要使用的一切资源(3)进程控制块:用来记录进程外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志.3.进程的作用:是想完成多任务并发,进程之间的内存地址是相互独立的二.线程:1.定义:最小的执行单位,线程的出现是为了

Unity协程(Coroutine)原理深入剖析(转载)

记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了.后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unity协程的原理的. 本文只是从Unity的角度去分析理解协程的内部运行原理,而不是从C#底层的语法实现来介绍(后续有需要再进行介绍),一共分为三部分: 线程(

Unity协程(Coroutine)原理深入剖析

尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了.后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unity协程的原理的. 本文只是从Unity的角度去分析理解协程的内部运行原理

C# 协程 WaitForSeconds产生GC(Garbage Collection)问题

孙广东   2015.4.9   24:00 先来看看使用协程的作用一共有两点:    1)延时(等待)一段时间执行代码:    2)等某个操作完成之后再执行后面的代码.总结起来就是一句话:控制代码在特定的时机执行.协程不是线程,也不是异步执行的.协程和 MonoBehaviour 的 Update函数一样也是在MainThread中执行的.使用协程你不用考虑同步和锁的问题. 对于使用协程带来GC问题,不推荐使用了!. 使用我之前封装的  游戏简单控制逻辑Clock类    可以完美解决 IEn