Files
zhamao-framework/assets/js/26.8e7089c0.js

1 line
12 KiB
JavaScript
Raw Permalink Normal View History

2024-09-19 08:29:13 +00:00
(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{735:function(r,e,o){"use strict";o.r(e);var _=o(84),v=Object(_.a)({},(function(){var r=this,e=r._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[e("h1",{attrs:{id:"框架的多进程"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#框架的多进程"}},[r._v("#")]),r._v(" 框架的多进程")]),r._v(" "),e("p",[r._v("首先对于多进程概念,对于传统 PHP 程序员可能比较陌生,唯一接触到的地方可能就是 php-fpm 等一些方式处理时间长的请求时开进程去执行。关于多进程,我觉得廖雪峰的 Python 多进程这段讲的不错:")]),r._v(" "),e("blockquote",[e("p",[r._v("Unix/Linux 操作系统提供了一个"),e("code",[r._v("fork()")]),r._v("系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是"),e("code",[r._v("fork()")]),r._v("调用一次,\n返回两次因为操作系统自动把当前进程称为父进程复制了一份称为子进程然后分别在父进程和子进程内返回。")])]),r._v(" "),e("p",[r._v("这里面的重点在于,多进程的创建,是父进程的复制,然后两个进程接下来运行的代码和存的内容就分道扬镳了。")]),r._v(" "),e("p",[r._v("PHP 也是如此,框架的多进程又是怎么一回事呢?为什么要采用多进程呢?")]),r._v(" "),e("h2",{attrs:{id:"作用"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#作用"}},[r._v("#")]),r._v(" 作用")]),r._v(" "),e("p",[r._v("使用过框架的你一定知道,框架是以命令行方式运行 PHP 的,而命令行方式运行 PHP就代表要常驻内存就像 Python、Node.js 一样。\n而默认情况下比如 Python 的 Flask 为单线程单进程模式,也就是说同时只能处理一个 Web 请求。\n但大部分情况下比如 Node.js提供的都是异步 I/O这也就是说明它在 Web 处理请求上,可同时承接的 I/O 密集型请求会更多一些,\n这样在对一般的 Web 应用中 I/O 密集型场景非常有用,而且往往只需要单进程也可以承载上万的并发请求。")]),r._v(" "),e("p",[r._v("在炸毛框架中,因为框架基于 Swoole、Workerman 等驱动构建,在使用 Swoole 驱动时可以将一部分 I/O 操作协程化。\n协程就是针对 I/O 操作进行一个调度,类似异步的 Node.js所以针对项目中存在太多的 SQL 语句执行、文件读写的话,只需换成 Swoole 驱动,无需做任何修改,也可以达到很好的性能。")]),r._v(" "),e("p",[e("strong",[r._v("但是")]),r._v("CPU 密集型的应用或 Workerman 怎么办呢?假设我的 Web 应用有大量的排序、md5 运算怎么办呢?\n这样的阻塞假设是一个超级大的 for 循环或者是要执行很长时间的 while 循环CPU 一直在被占用。多进程就是针对 CPU 密集型的应用说 yes 的一个方案。")]),r._v(" "),e("h2",{attrs:{id:"多进程类型"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#多进程类型"}},[r._v("#")]),r._v(" 多进程类型")]),r._v(" "),e("p",[r._v("框架多进程中,所有进程的功能和名称是有区别的。")]),r._v(" "),e("ul",[e("li",[r._v("Master 进程:主进程,负责执行最初的启动代码,也是接下来其他类型进程的父进程,它一般不会执行任何业务代码,只是负责管理其他进程。")]),r._v(" "),e("li",[r._v("Manager 进程:在使用 Swoole 驱动且使用了 "),e("code",[r._v("SWOOLE_PROCESS")]),r._v(" 模式启动框架后,会出现,由 Master 进程 fork 而来,用于管理 Worker 进程。")]),r._v(" "),e("li",[r._v("Worker 进程:主要逻辑的工作进程,用户态代码在这里被加载。在 Swoole 驱动的 "),e("code",[r._v("SWOOLE_PROCESS")]),r._v(" 模式下由 Manager 进程 fork 而来,在 Workerman 驱动下由 Master 进程 fork 而来。")]),r._v(" "),e("li",[r._v("TaskWorker 进程:在使用 Swoole 驱动且设置了 "),e("code",[r._v("taskworker_num")]),r._v("