您好,欢迎访问一九零五行业门户网

swoole协程怎样实现

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协程实现方案如下图所示:
其中:
·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栈的创建以及换入换出。
,有大量免费的swoole入门教程,欢迎大家学习!
以上就是swoole协程怎样实现的详细内容。
其它类似信息

推荐信息