zoukankan      html  css  js  c++  java
  • php多进程和多线程的比较

    前言

      最近在学习php多进程和多线程的编程。说实话,这两样在工作中几乎都没有用到,毕竟php并不以异步处理擅长,对于网络请求同步处理可以解决绝大多数问题。但是既然有这样的机制,也了解一下,对于以后接触别的语言也有好处。

    php处理请求机制

       以nginx作为web服务器为例,nginx将对php发起的http请求交给FastCGI进程监听的IP地址及端口,由php-fpm(FastCGI Process Manager)作为动态解析服务器处理,最后再把处理结果交给nginx,nginx再返回给客户端。那么php-fpm如何处理呢?大家可能知道,php-fpm分 master进程和worker进程(如下图,来源网络)。master接受到请求,指派特定的worker进程来处理,worker进程处理请求,返回结果给nginx。想细致了解,可以参考:nginx和php之间是怎样通信的呢深入理解PHP之:Nginx 与 FPM 的工作机制

      从以上描述我们可以看出,一个单一的php-fpm worker就是同步阻塞,单进程单线程的处理机制。现在我们来讨论的是如何让一个php-fpm worker 实现多进程或多线程,以及这两种机制的比较。先来看看多进程和多线程的相关概念。

    多进程和多线程的相关概念

      进程:进程是资源分配的最小单位;

      线程:线程是CPU调度的最小单位。

      选择多进程好还是选择多线程好?需要根据实际情况来判断,下面也是网络上对多线程和多进程的一番对比:

      

    详细的请参考:多进程还是多线程的选择和区别 ,感觉这位牛人写的特别清楚。下面我们再来看看php环境下使用多进程和多线程要注意的。

    php下多进程和多线程使用注意事项

      安装配置

      在php下使用多进程需要开启pcntl扩展。

      php下使用多线程需要开启pthread扩展,并且要求在php编译安装的时候就已经设置了线程安全(这个还是比较麻烦,需要重新编译安装php)。

      通信机制

      多进程和多线程下都可以使用全局变量。

      进程间的通信机制是管道(pipe)。

      在php下,由于线程安全的实现机制,线程间无法进行通信。

    线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。

       PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就不会出现线程安全问题。同时 PHP 开启线程安全选项后,使用 TSRM 机制分配和使用变量时也会有额外的损耗。

    CPU的使用

      从进程和线程的定义就可以知道,cpu一个核同一时间只能处理一个线程。所以单核cpu的服务器就不要考虑使用多线程或者多进程去做任务了,因为切换进程或者线程的开销让使用完全没有意义。但是多进程在守护进程的开发上还是有作用的。这个在单独介绍多进程的文章中详细说明。对于多核cpu可以根据实际情况选择多进程还是多线程。比如网络上很多例子提到的需要并发请求很多url,就可以用到多线程(无需线程间的通信)。 

    --------------------------------------

    2018.4.24补充一下,以上观点是错误的。对于单核CPU,如果任务是I/O密集型,则使用多线程或多进程仍然可以大幅缩短时间,和多核CPU效果是一样的,因为时间的瓶颈不在CPU而在I/O。但是CPU密集型,计算比较多的任务则单核CPU对多进程或多线程没有多大的优化效果。   

     web环境下使用

      web环境下,不能使用多进程,这个官方文档有说明。

      web环境下,可以使用多线程。

      

    参考资料:

    nginx和php之间是怎样通信的呢

    PHP多进程处理并行处理任务实例

    深入理解PHP之:Nginx 与 FPM 的工作机制

    多进程还是多线程的选择和区别

    多线程编程 - PHP 实现

    作者:Leven
    本博客主要记录个人工作和学习中的一些总结,经验和感悟。欢迎转载和评论,转载请给出原文链接。
    您也可以通过邮箱联系我:leven_developer#outlook.com
    如果文章对您有所帮助,您可以给我一点打赏,会让我更有动力做所从事的事情,非常感谢。
  • 相关阅读:
    Anaconda+Tensorflow环境安装与配置(转载)
    Win10 Anaconda下TensorFlow-GPU环境搭建详细教程(包含CUDA+cuDNN安装过程)(转载)
    设计模式之工厂方法模式VS简单工厂方法模式
    WPF之外观模式
    WPF之小动画三
    WPF之小动画二
    WPF之小动画一
    WPF之Behavior
    WPF之拖动项滚动条自滚动(当拖动项到达高度的边界时候滚动条自己可以上下滚动)
    WPF之给使用了模板的MenuItem添加快捷操作
  • 原文地址:https://www.cnblogs.com/Andres/p/8907689.html
Copyright © 2011-2022 走看看