Swoole---协程学习

Swoole4协程引擎

Swoole4 使用全新的协程内核引擎,现在我们拥有一个全职的开发团队,因此我们正在进入 PHP 历史上前所未有的时期,为性能的高速提升提供了独一无二的可能性。

Swoole4 或更高版本拥有高可用性的内置协程,您可以使用完全同步的代码来实现异步 IO,PHP 代码没有任何额外的关键字,底层会自动进行协程调度。
代码测试第一次

go(function () {
    co::sleep(1);//非阻塞
    //sleep(1);//阻塞
    echo '协程1' . PHP_EOL;
});
echo "xxxx swoole" . PHP_EOL;
Swoole\Coroutine::create(function () {
    //co::sleep(1);
    echo "协程2" . PHP_EOL;
});

非阻塞结果

xxxx swoole
协程2
协程1

第二次

go(function () {
    //co::sleep(1);//非阻塞
    sleep(1);//阻塞
    echo '协程1' . PHP_EOL;
});
echo "xxxx swoole" . PHP_EOL;
Swoole\Coroutine::create(function () {
    //co::sleep(1);
    echo "协程2" . PHP_EOL;
});

阻塞结果

协程1
xxxx swoole
协程2

一键协程化
Runtime
相对于 Swoole1.x,Swoole4+ 提供了协程这个大杀器,所有业务代码都是同步的,但底层的 IO 却是异步的,保证并发的同时避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护, 要达到这个效果必须所有的 IO 请求都是异步 IO,而 Swoole1.x 时代的提供的 MySQL、Redis 等客户端虽然是异步 IO,但是是异步回调的编程方式,不是协程方式,所以我们在 Swoole4 时代移除了这些客户端。

为了解决这些客户端的协程支持问题我们做了大量的工作:

刚开始,我们针对每种类型的客户端都做了一个协程客户端,详见协程客户端,但这样做有 3 个问题:

实现复杂,每个客户端细枝末节的协议都很复杂,想都完美的支持工作量巨大。
用户需要更改的代码比较多,比如原来查询 MySQL 是用的 PHP 原生的 PDO,那么现在需要用 Swoole\Coroutine\MySQL 的方法。
我们很难覆盖到所有的操作,比如 proc_open()、sleep() 函数等等也可能阻塞住导致程序变成同步阻塞的。
针对上述问题,我们换了实现思路,采用 Hook 原生 PHP 函数的方式实现协程客户端,通过一行代码就可以让原来的同步 IO 的代码变成可以协程调度的异步 IO,即一键协程化。
再次执行代码

Swoole\Runtime::enableCoroutine(true);//开启一键协程化
go(function () {
    //co::sleep(1);//非阻塞
    sleep(1);//阻塞
    echo '协程1' . PHP_EOL;
});
echo "xxxx swoole" . PHP_EOL;
Swoole\Coroutine::create(function () {
    //co::sleep(1);
    echo "协程2" . PHP_EOL;
});

执行结果

xxxx swoole
协程2
协程1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值