Swoole是一个基于异步、并行、协程的PHP网络通信框架,它使用了多进程模型来提高性能和并发处理能力。
Swoole是一个为PHP用C和C++编写的基于事件的高性能&协程并行网络通信引擎。

1、网络请求处理是基于事件的,利用了底层的epoll/kqueue实现,使得为数百万个请求提供服务变得非常容易。
进程:进程可看作为分配资源的基本单位,比如打开一个应用程序或一个窗体,分配完整且独立的内存空间(有独立的堆和栈),进程的切换由操作系统来调度。一个进程就是一个运行的程序。
线程:轻量级的进程(Lightweight Process,LWP),CPU调度执行的最小单位。
协程:超轻量级的线程,在一个进程中创建成千上万个协程;完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源;协程解决了异步回调代码嵌套的问题,提高了代码的可读性和程序的可维护性。
协程(coroutine)也是一种程序组件,或者说是一个特定的函数。goroutine可以看作是协程的go语言实现,它是语言原生支持的,相对于一般由库实现协程的方式,goroutine更加强大,它的调度一定程度上是由go运行时(runtime)管理。其好处之一是,当某goroutine发生阻塞时(例如同步IO操作等),会自动出让CPU给其它goroutine。
什么是进程,线程?平时写出的代码如果没有加线程类的话,可以将它看为单进程。进程可以理解为是一道正在执行的程序或者运动的对象,将此进程比作一个游戏程序,而线程就是其中的一个个功能。一个进程包含了1-n个线程,多进程就是几个程序代码在一个机器里同时运行。
什么是并行? 我们都知道CPU的逻辑处理器个数决定了它可以同时调度多个逻辑处理器,其实逻辑处理器的数量可以称为并行量(越多执行的就越流畅)。
并行就是多个逻辑处理器一起执行,互不干扰,比如人也有CPU,吃饭喝水两个不同的状态,毫不影响。
什么是并发?并行是关于多个逻辑处理器的,而并发是一个逻辑处理器的事情,并发是一个逻辑处理器在一段时间完成的线程量。
三者之前的关系,画了个图(可能图也不一定对,只是想画个图看起来清楚一些)

子程序或者称为函数:在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。
协程的调用和子程序不同:
协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。
def A():
print '1'
print '2'
print '3'
def B():
print 'x'
print 'y'
print 'z'
假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,结果可能是:1 2 x y 3 z。
协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;
不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
进程和线程
- 进程是操做系统层面的概念,线程是CPU层面的东西,CPU真正执行的是线程而不是进程
- 进程是是静态的概念,是一些资源的集合,好比进程有本身的内存;而线程是动态的概念
- 进程能够有多个线程,这些线程共享同一份进程的资源
- 多进程,目前多核的状况下,能够作到多个进程同时执行;固然也就能够作到多个线程同时执行。可是单核的CPU没法作到 “同时”
- 进程是必定有端口号吗? 不必定,没网络暴露的就没有
并发和并行
并行是说物理上的 “同时” 被执行。
并发是一种程序设计,可以让多个任务在逻辑上交织执行。
并发设计的程序,能够启动n个线程,好比2个,而后交给2个核,这时两个线程就是并行执行的(“同时”);这两个线程也能够被1个核 “交替” 执行。
不少时候,会认为并行就是真的同时执行,而并发就是交替执行,这是通常的理解,可是并发真正含义是指设计的程序容许同时 或 交替执行,是一种程序设计方案。
goroutine的调度
goroutine调度器主要有4个重要结构:
- Sched:它的结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等
- M:代表内核级线程,一个M就是一个线程,goroutine就是跑在M之上的;M是一个很大的结构,里面维护小对象内存cache(mcache)、当前执行的goroutine、随机数发生器等等非常多的信息
- P:全称是Processor,处理器,它的主要用途就是用来执行goroutine的,所以它也维护了一个goroutine队列,里面存储了所有需要它来执行的goroutine
- G:goroutine实现的核心结构,G维护了goroutine需要的栈、程序计数器以及它所在的M等信息。
- M代表OS线程,G代表goroutine,P的概念比较重要,它表示执行的上下文,其数量由$GOMAXPROCS决定,一般来说正好等于处理器的数量。M必须和P绑定才能执行G,调度器需要保证所有的P都有G执行,以保证并行度。如下图:

