zoukankan      html  css  js  c++  java
  • PHP系统编程--01.多进程与多线程

    PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程。fork调用后执行的代码将是并行的。

    PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特性,地址是http://pecl.php.net/package/pthreads,此扩展仅在线程安全版本中可用。

    多进程

    1. 使用多进程, 子进程结束以后, 内核会负责回收资源
    2. 使用多进程, 子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
    3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
    4. 多进程方式更加稳定,另外利用进程间通信(IPC)也可以实现数据共享。
    5. 共享内存,这种方式和线程间读写变量是一样的,需要加锁,会有同步、死锁问题。
    6. 消息队列,可以采用多个子进程抢队列模式,性能很好

    多线程

    1. 线程是在同一个进程内的,可以共享内存变量实现线程间通信
    2. 线程比进程更轻量级,开很大量进程会比线程消耗更多系统资源
    3. 多线程也存在一些问题:

      • 线程读写变量存在同步问题,需要加锁
      • 锁的粒度过大存在性能问题,可能会导致只有1个线程在运行,其他线程都在等待锁
      • 同时使用多个锁,逻辑复杂,一旦某个锁没被正确释放,可能会发生线程死锁
      • 某个线程发生致命错误会导致整个进程崩溃

    php搭建pcntl

    在PHP中进程控制支持默认是关闭的。您需要使用 –enable-pcntl 配置选项重新编译PHP来打开进程控制支持。注:pcntl只支持Linux版本

    ##本例用的php版本的是5.3.3,
    cd php-5.3.3/ext/pcntl
    phpize
    ./configure --with-php-config=/usr/local/bin/php-config
    make
    make isntall
    

    在php.ini下加入pcntl.so即可

    extension=pcntl.so

    代码演示

    现在我们通过 pcntl扩展来调用操作系统的fork实现多进程。fork调用后执行的代码将是并行的。

    <?php
    $pid = pcntl_fork();
    if($pid > 0){
        echo "parent
    ";
    }elseif($pid == 0){
        echo "child
    ";
    }else{
        echo "error
    ";
    }
    

    参考地址:

    http://php.net/manual/zh/book.pcntl.php

    http://www.laruence.com/2009/06/11/930.html





  • 相关阅读:
    CenterNet-TensorRT错误记录
    NAS研究要点分析
    conda如何安装从源下载的离线安装包
    Xavier上pytorch半精度inference问题
    Xavier 使用便携程序
    Xavier疑问
    Python输入(Leetcode
    兴趣爱好
    生活目标
    TX2装机教程
  • 原文地址:https://www.cnblogs.com/linzhenjie/p/5485419.html
Copyright © 2011-2022 走看看