swoole 进程与线程篇

最近公司的物联网设备架构有所调整,需要长连接保持,一直觊觎了很久的 Swoole 学习提上日程。
至于 Swoole 是做什么的,Swoole官网给出了一堆很 NB 的介绍。总之你需要知道

swoole是基于C开发的一个php扩展,类似你熟悉的Mysqli、cURL等等。但是swoole更强大,它几乎重新定义了php的高度,让php变得更加无可挑剔。也让phper们的前景更加辽阔!

既然 Swoole 那边 NB 闪闪,感觉一副高大上的样子,那再学习之前必须要做好预习准备啦。下面的笔记借鉴了白狼栈的学习教程,有兴趣的同学可以付费认证的看上一遍,真的写的很不错!

进程

对于操作系统而言,进程就是一个任务,比方说你打开了一个记事本,那就启动了一个进程,打开了两个浏览器,就是另外开启了两个进程,简单的说一个进程至少要干一件事情。
对于Linux 系统而言,如果你想查看当前系统中运行的进程,可以通过 ps命令进行查看:

1
$ ps aux | grep php

执行以上命令,我能够看到我机器上运行的 PHP 进程:

1
2
3
4
5
$ ps aux | grep php
www 2051 0.0 0.0 2484400 2572 ?? S 9:08上午 0:00.05 php-fpm
www 2050 0.0 0.0 2484528 2976 ?? S 9:08上午 0:00.16 php-fpm
www 2049 0.0 0.0 2471088 396 ?? Ss 9:08上午 0:00.68 php-fpm
www 59050 0.0 0.0 2442020 1968 s001 S+ 3:52下午 0:00.00 grep php

至于后边一堆时间什么的,如果不知道什么意思,建议看下鸟哥的 Linux 基础。

线程

有些情况下,一个进程会同时做一些事情,比如说word。它可以同时进行打字、拼写检查等操作。注意这里我们说的同时进行。像这样,在一个进程内部,同时运行着多个“子任务”,我们就可以把这些子任务称之为“线程”。即进程是由多个线程组成的,一个进程至少要有一个线程。实际上,线程是操作系统最小的执行单元。

多任务的实现

试想一下,如果我们要同时执行多个任务怎么办?

根据上文的理解,我们可以:

  • 启动多个进程
  • 启动一个进程,并在该进程内启动多个线程
  • 启动多个进程,每个进程内启动多个线程

多进程的实现

熟悉 Apache 的同学其实很好理解。
当父进程监听到有新的请求时,Apache 就回 fork出一个新的子进程来对之进行处理。
Linux 的 fork()函数通过系统调用即可实现创建一个与原进程几乎相同的进程。对于多任务,通常我们会设计Master-Worker模式,即一个Master进程负责分配任务,多个Worker进程负责执行任务。同理,如果是多线程,Master就是主线程,Worker就是子线程。

多进程与多线程的区别

开始迷糊了对吧,那就理解一下多进程和多线程的区别吧,以便应对场景做出合适的选择。
进程和线程的关系就像地主和佃户。地主,有土地(系统资源);佃户,执行种地流程;

  • 多进程的优点就是稳定性很高,如果一个进程挂了,不会影响其他子进程,当然,如果主进程挂了那就都玩完(主进程挂掉的可能性微乎其微,后面讲进程模型会说到)。而对于多线程,这个恐怕就是致命的缺点了,因为所有线程共享内存,如果某一个线程挂了,那这个进程几乎就崩溃了。

  • 性能方面,不论是进程还是线程,如果启动太多,无疑都会带来CPU的调度问题,因为进程或者线程的切换,本身就非常耗费资源。数量达到一定程度的时候,CPU和内存就消耗殆尽,电脑就死机了。
    举一个例子:使用过windows的用户都知道,如果我们打开的软件越多(开启的进程也就越多),电脑就会越卡,甚至装死机没反应。

  • 线程与进程相比,自然是要比进程更轻量一些,而且线程之间是共享内存的,所以不同线程之间的交互就显得容易实现。而对于多进程之间的通信,需要借助消息队列,共享内存等复杂的方式才可以实现。

进程和线程一定要研究明白是怎么回事
思考一下php、nginx、apache各自跟线程和进程是什么关系,可百度,可google,可下面留言。

坚持原创技术分享,您的支持将鼓励我继续创作!