swoole中是否支持多线程,为什么
Admin 2022-07-21 群英技术资讯 981 次浏览
今天就跟大家聊聊有关“swoole中是否支持多线程,为什么”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“swoole中是否支持多线程,为什么”文章能对大家有帮助。
Reactor线程
Swoole\Server的主进程是一个多线程的程序。其中有一组很重要的线程,称之为Reactor线程。它就是真正处理TCP连接,收发数据的线程。
Swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。
分配的计算方式是fd % serv->reactor_num
由于PHP语言不支持多线程,因此Swoole使用多进程模式。在多进程模式下存在进程内存隔离,在工作进程内修改global全局变量和超全局变量时,在其他进程是无效的。
设置worker_num=1时,不存在进程隔离,可以使用全局变量保存数据
进程隔离
$fds = array();
$server->on('connect', function ($server, $fd){
echo "connection open: {$fd}\n";
global $fds;
$fds[] = $fd;
var_dump($fds);
});$fds 虽然是全局变量,但只在当前的进程内有效。Swoole服务器底层会创建多个Worker进程,在var_dump($fds)打印出来的值,只有部分连接的fd。
对应的解决方案就是使用外部存储服务:
数据库,如:MySQL、MongoDB
缓存服务器,如:Redis、Memcache
磁盘文件,多进程并发读写时需要加锁
普通的数据库和磁盘文件操作,存在较多IO等待时间。因此推荐使用:
Redis 内存数据库,读写速度非常快
/dev/shm 内存文件系统,读写操作全部在内存中完成,无IO消耗,性能极高
除了使用存储之外,还可以使用共享内存来保存数据
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSI...
php变量中的两种复合类型:1、数组(array),数组可以存储多个数据,可以是任何类型。2、对象(object),对象是一种比数组更先进的复合数据类型。
在本篇文章里小编给大家整理的是一篇关于php png失真的原因及解决办法,有需要的朋友们可以跟着学习参考下。
一一得一;一二得二二二得四;一三得三二三得六三三得九......相信九九乘法表口诀已经刻入每个中国人的骨髓了吧哈哈~不过今天咱们来写一个六六乘法表,主要用PHP来实现输出!其实实现的方法是非常简单的,主要希望这样的思路能让大家在其他开发过程中能举一反三!
php7 500错误的解决办法:首先查看Nginx的错误日志;然后使用命令“aptitude install php-mbstring php-xml”安装扩展即可。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008