参考文献

什么是reactor模型:https://www.cnblogs.com/52php/p/5701354.html

php代码下载:https://github.com/mailjobblog/dev_php_io/tree/master/test/reactor

图解reactor模型:https://blog.csdn.net/weixin_39724469/article/details/111295927

Reactor介绍

connection per thread

在BIO线程模型中,为了解决同步阻塞的问题,采用了多线程的方式处理并发,即经典的connection per thread,每一个连接用一个线程处理。虽然在单个线程内仍然是阻塞的,但在整体上看是可以同时处理多个连接请求的,原理图如下:

8c9d2203ab7b7a059d241a091f7280fd.png

但这种方式的缺点在于资源要求太高,系统中创建线程是需要比较高的系统资源的,如果连接数太多,系统无法承受,而且,线程的反复创建和销毁也需要代价。

Reactor线程思想

为了解决这个问题,出现了Reactor线程模型。简单来说,Reactor线程模型就是多路I/O复用结合线程池的思想

  • I/O多路复用:多个连接共用一个阻塞对象(即下图中的ServiceHandler),应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接,当某个连接有新的数据可以处理时,操作系统通知应用程序线程从阻塞状态返回,并将数据分发给对应的线程处理
  • 基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务交给线程池中的线程处理,处理完成后归还线程,同一个线程可以处理多个连接的业务,达到线程复用

0bc3701da6ea80285ce9175e1d5f87fa.png

PHP原生代码实现

image-20210520104707852

image-20210520104728279