swoole协程如何实现

  介绍

这篇文章给大家分享的是有关swoole协程如何实现的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

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

& lt; PHP ?//公司::睡眠()是Swoole提供的API,并不会阻塞当前进程,只会阻塞协程触发协程切换。   去(function  () {   ,,,.::睡眠(1);   ,,,echo “a";   });   去(function  () {   ,,,.::睡眠(2);   ,,,echo “b";   });   echo “c";//输出结果:出租车//程序总执行时间2秒以前

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

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

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

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

 swoole协程如何实现

其中:

<强>· API层是提供给用户使用的协程相关函数,比如()去函数用于创建协程;有限公司::收益率()使得当前协程让出CPU;有限公司::简历()可恢复某个协程执行;

<强>· Swoole4协程需要同时管理c栈与php栈,协同程序用于管理c栈,PHPCoroutine用于管理php栈;其中协同程序(),收益率(),简历()实现了c栈的创建以及换入换出,create_func (), on_yield (), on_resume()实现了php栈的创建以及换入换出,

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

<强>· Swoole4对boost.context进行了简单封装,即上下文层,上下文(),SwapIn()以及SwapOut ()

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

感谢各位的阅读!关于swoole协程如何实现就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

swoole协程如何实现