您的位置:首页 > 技术中心 > php框架 >

swoole协程怎样实现

时间:2019-12-10 16:20

Swoole4为PHP语言提供了强大的CSP协程编程模式,用户可以通过go函数创建一个协程,以达到并发执行的效果,如下面代码所示:

<?php
//Co::sleep()是Swoole提供的API,并不会阻塞当前进程,只会阻塞协程触发协程切换。
go(function (){
    Co::sleep(1);
    echo "a";
});
go(function (){
    Co::sleep(2);
    echo "b";
});
echo "c";
//输出结果:cab
//程序总执行时间2秒

其实在Swoole4之前就实现了多协程编程模式,在协程创建、切换以及结束的时候,相应的操作php栈即可(创建、切换以及回收php栈)。

此时的协程实现无法完美的支持php语法,其根本原因在于没有保存c栈信息。(vm内部或者某些扩展提供的API是通过c函数实现的,调用这些函数时如果发生协程切换,c栈该如何处理?)

Swoole4新增了c栈的管理,在协程创建、切换以及结束的同时会伴随着c栈的创建、切换以及回收。

Swoole4协程实现方案如下图所示:

1575965586258468.png

其中:

·API层是提供给用户使用的协程相关函数,比如go()函数用于创建协程;Co::yield()使得当前协程让出CPU;Co::resume()可恢复某个协程执行;

·Swoole4协程需要同时管理c栈与php栈,Coroutine用于管理c栈,PHPCoroutine用于管理php栈;其中Coroutine(),yield(),resume()实现了c栈的创建以及换入换出;create_func(),on_yield(),on_resume()实现了php栈的创建以及换入换出;

·Swoole4在管理c栈时,用到了 boost.context库,make_fcontext()和jump_fcontext()函数均使用汇编语言编写,实现了c栈上下文的创建以及切换;

·Swoole4对boost.context进行了简单封装,即Context层,Context(),SwapIn()以及SwapOut()

对应c栈的创建以及换入换出。

PHP中文网,有大量免费的Swoole入门教程,欢迎大家学习!

以上就是swoole协程怎样实现的详细内容,更多请关注gxlsystem.com其它相关文章!

热门排行

今日推荐

热门手游