swoole中是否支持多线程,为什么
Admin 2022-07-21 群英技术资讯 887 次浏览
今天就跟大家聊聊有关“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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
phpstorm编辑器字体出现乱码的解决办法及步骤是:1、进入phpstorm编辑器设置选项;2、进入文件编码选项;3、将UTF-8改成GBK编码即可。
laravel forge是一个使PHP部署变得轻而易举的工具,它允许用户使用Git和一些流行的服务器提供商来启动云服务器并处理部署过程。laravel forge拥有大量功能和易于使用的UI,可让用户轻松创建和配置服务器以及部署应用程序;配置服务提供商后,很有可能用户无需访问AWS控制台即可再次管理服务器。
php利用ZipArchive类操作文件的实例,ZipArchive类是专门用于文件的压缩与解压操作的类,通过压缩文件可以达到节省磁盘空间的目的,并且压缩文件体积更小,便于网络传输。
thinkphp默认使用的是内置模板引擎,是一个自主创新的XML编译性模板引擎;内置模板引擎支持模板文件中采用php原生态代码和模板标签的混合使用,视图的模板文件可以支持不同的解析规则,默认情况下无需手动初始化模板引擎。
break(PHP4,PHP5)break 结束当前 for,foreach,while,do-while 或者 switch 结构的执行。break 可以接受一个可选的数字参数来决定跳出几重循环。<?php...
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008