PHP多进程(三) 理解多进程

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

本篇是一个过渡篇

( 重在理解多进程 以及进程执行过程和进程执行后的数据 )

废话不多说直接上代码 运行下面代码前 可以先想想有几个进程以及$count 是多少?

<?php

// 开始多进程
$count = 10;
for ($i=0;$i<2;$i++){
    epd('我是循环记数值'.$i);
    $pid = pcntl_fork(); // fork进程
    if ($pid == 0){
        // 子进程
        $count++;
        epd('我是儿子'.posix_getpid().'$count='.$count);
    }else{
        // 父进程
        $count *=10;
        epd("我是父亲".posix_getpid()."我的儿子是".$pid.'$count='.$count);
        // break;
    }
}
while (true){
    ;
}

function epd($content){
    echo $content."\r\n";
}

最后结果是否与你心中所想一样呢?

我第一次也理解不了

下面我放出执行分析流程


1.父进程 [ 17068 ] 执行for循环  ( 原数据:$i = 0; $count = 10; ) fork一个子进程 child1 [ 17069 ] 执行if判断 ( 新数据:$i = 1; $count = 100; )
2.子进程 child1 [ 17069 ]  ( 原数据:$i = 0; $count = 10; ) 执行if判断 ( 新数据:$i = 1; $count = 11;  ) 
3.父进程 [ 17068 ] 执行for循环 ( 原数据:$i = 1; $count = 100; ) fork一个子进程 child2 [ 17070 ] 执行if判断 ( 新数据:$i = 2; $count = 1000; )
4.子进程 child2 [ 17070 ] ( 原数据:$i = 1; $count = 100; ) 执行if判断 ( 新数据:$i = 2; $count = 101; )
5.子进程 child1 [ 17069 ] 执行for循环 ( 原数据:$i = 1; $count = 11 ) fork一个子进程 child3 [ 17071 ] 执行if判断 ( 新数据:$i = 2; $count = 110; )
6.子进程 child3 [ 17071( 原数据:$i = 1; $count = 11 ) 执行if判断 ( 新数据:$i = 2; $count = 12; )

注意点:

子进程是从fork位置向下走的 

上面分析流程不代表执行循序 切记不代表 不代表 不代表 说三遍

因为进程调度是cpu决定的 所以上面流程是分析最终结果

为啥子进程还会再创建子进程? 

因为子进程向下执行完之后for循环还没执行完 所以会接着走


我们改一下代码 

我们让父进程fork子进程之后终止循环

<?php

// 开始多进程
$count = 10;
for ($i=0;$i<2;$i++){
    epd('我是循环记数值'.$i);
    $pid = pcntl_fork(); // fork进程
    if ($pid == 0){
        // 子进程
        $count++;
        epd('我是儿子'.posix_getpid().'$count='.$count);
    }else{
        // 父进程
        $count *=10;
        epd("我是父亲".posix_getpid()."我的儿子是".$pid.'$count='.$count);
        break; // 父进程跳出循环
    }
}
while (true){
    ;
}

function epd($content){
    echo $content."\r\n";
}


1.父进程 [ 16206 ] 执行for循环  ( 原数据:$i = 0; $count = 10; ) fork一个子进程 child1 [ 16207 ] 执行if判断 ( 新数据:$count = 100; break;终止循环 )
2.子进程 child1 [ 16207 ] ( 原数据:$i = 0; $count = 10; ) 执行if判断 ( 新数据:$i = 1; $count = 11;  ) 
3.子进程 child1 [ 16207 ] 执行for循环  ( 原数据:$i = 1; $count = 11; ) fork一个子进程 child2 [ 16208 ] ( 新数据: $count = 110; break;终止循环 )
4.子进程 child2 [ 16208 ] ( 原数据:$i = 1; $count = 11 ) 执行if判断 ( 新数据:$i = 2; $count = 12; )

....................


我们继续增加循环次数看看

我们再改一下代码 

我们让子进程执行之后终止循环

<?php

// 开始多进程
$count = 10;
for ($i=0;$i<4;$i++){
    epd('我是循环记数值'.$i);
    $pid = pcntl_fork(); // fork进程
    if ($pid == 0){
        // 子进程
        $count++;
        epd('我是儿子'.posix_getpid().'$count='.$count);
        break; // 子进程跳出循环
    }else{
        // 父进程
        $count *=10;
        epd("我是父亲".posix_getpid()."我的儿子是".$pid.'$count='.$count);
    }
}
while (true){
    ;
}

function epd($content){
    echo $content."\r\n";
}


1.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 0; $count = 10; ) fork一个子进程 child1 [ 4698 ] 执行if判断 ( 新数据:$count = 100; $i = 1 )
2.子进程 child1 [ 4698 ] ( 原数据:$i = 0; $count = 10; ) 执行if判断 ( 新数据:$count = 11; break;终止循环 )
3.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 1; $count = 100; ) fork一个子进程 child2 [ 4699 ] 执行if判断 ( 新数据:$count = 1000; $i = 2 )
4.子进程 child2 [ 4699 ] ( 原数据:$i = 1; $count = 100; ) 执行if判断 ( 新数据:$count = 101; break;终止循环 )
5.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 2; $count = 1000; ) fork一个子进程 child3 [ 4670 ] 执行if判断 ( 新数据:$count = 10000; $i = 3 )
6.子进程 child3 [ 4670 ] ( 原数据:$i = 2; $count = 1000; ) 执行if判断 ( 新数据:$count = 1001; break;终止循环 )
7.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 3; $count = 10000; ) fork一个子进程 child4 [ 4671 ] 执行if判断 ( 新数据:$count = 100000; $i = 4 )
8.子进程 child4 [ 4671 ] ( 原数据:$i = 3; $count = 10000; ) 执行if判断 ( 新数据:$count = 10001; break;终止循环 )

....................


让父进程终止循环进程关系就是无限极的形式

让子进程终止循环进程关系就是一个父亲和他的儿子们

文章带有局限性,重在理解,并自己手动测试下直到理解为止,因为这点确实很重要

再说一遍:

执行过程我用序号标记是分清逻辑 不代表cpu调度 

进程执行顺序是由cpu决定的 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: php

“PHP多进程(三) 理解多进程” 的相关文章