swoole如何通过go函数实现协程,代码是什么
Admin 2022-08-30 群英技术资讯 903 次浏览
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栈的创建以及换入换出。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本章节我们将介绍如何使用PHP验证客户端提交的表单数据。在PHP网站开发中,用户通过form表单提交数据信息,为了避免提交的数据是正确的、完整的、安全的,我们需要对PHP表单进行验证。
我们在开发的过程中常常遇到需要把对象或者数组进行序列号存储,反序列化输出的情况。特别是当需要把数组存储到mysql数据库中时,我们时常需要将数组进行序列化操作。 序列化(串行化):是将变量转换为可保存或传输的字符串的过程; 反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用。 这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 常见的php序列化和反序列化方式主要有:serialize,unserialize;json_encode,json_decode。_来自PHP 教程,w3cschool编程狮。
压缩字符串:base64_encode(gzcompress(serialize($data)))解压字符串:unserialize(gzuncompress(base64_decode($search_cache['data'])));判断是否是base64:functionis_base64($str){return$str==base64_encode(base64
很多PHP新手对于进程管理php-fpm不是很了解,因此,下面小编就给大家介绍一下PHP进程管理器php-fpm的工作原理以及PHP进程管理器php-fpm的操作。
PHP7栏目讲解如何配置mysqli和使用mysqli连接mysql,方法简单明了,有需要的朋友可以看看,学习学习。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008