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

news2024/11/19 10:19:28

本篇是一个过渡篇

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

废话不多说直接上代码 运行下面代码前 可以先想想有几个进程以及$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决定的 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用DBeaver 编辑链接达梦数据库

1、点击 “数据库”&#xff0c;选择“驱动管理器” 2、选择“新建” 3、 设置驱动 驱动名称&#xff1a;自定义 这里命名为“DM” 类名&#xff1a; dm.jdbc.driver.DmDriver URL模板&#xff1a;jdbc:dm://{host}:{port} 或jdbc:dm://{host}[:{port}]/[{database}] 默认端…

根据java反射-手写springIoC

我们都知道&#xff0c;Spring框架的IOC是基于Java反射机制实现的&#xff0c;下面我们先回顾一下java反射。 回顾Java反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能…

ResNet简单介绍+Pytroch代码实现

文章目录一、背景介绍二、ResNet网络结构1.ResNet34结构示意图2.不同层数的ResNet采用的Block结构。3.不同层数的ResNet网络结构示意图4.实验结果三、Pytroch代码1.代码简单介绍2. 常见ResNet网络代码汇总四、参考文献一、背景介绍 问题&#xff1a; 当网络层数越来越深时&…

Vulkan 编程指南记录

1 创建Vulkan instance 利用CreateInfo结构体指定硬件驱动需要使用的程序信息&#xff0c;这些信息可能会被作为驱动程序的优化依据指定程序需要使用的全局扩展。比如和窗口系统交互的扩展&#xff08;通过glfw库的接口获取&#xff09;。可以通过vkEnumerateInstanceExtensio…

一篇文章全知全能SpringBoot Bean的生命周期

系列文章&#xff1a;https://gamwatcher.blog.csdn.net/article/details/124603278这篇文章也是计划了蛮久的了&#xff0c;一直没写&#xff0c;正所谓大道行思&#xff0c;取则行远&#xff0c;总结也是学习的一种方式。&#x1f648;记得看目录哦1、关于spring1.1 什么是sp…

Spring Security在前端后端分离项目中的使用

Spring Security 是 Spring 家族中的一个安全管理框架&#xff0c;可以和Spring Boot项目很方便的集成。Spring Security框架的两大核心功能&#xff1a;认证和授权 认证&#xff1a; 验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。简单的理解就…

全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like(),between(),orderByAsc()等方法以及分页操作

文章目录1. 引言2. 结构关系3. 环境配置3.1 引入jar包3.2 创建数据源3.2 创建User实体类3.4 创建UserMapper类3.5 创建UserService类4. 操作演示5. 注意事项1. 引言 mybatis大家都有使用过&#xff0c;既面向对象又灵活可配。不友好的地方是&#xff0c;会随着使用出现大量xml…

C++之缺省参数以及C++的输入输出

文章目录前言一、缺省参数的定义二、缺省参数的分类1.全缺省参数2.半缺省参数三、缺省参数的注意事项1. 半缺省参数必须从右往左依次来给出&#xff0c;不能间接给缺省值2. 缺省参数不能在函数声明和定义中同时出现3. 缺省值必须是常量或者全局变量4. C语言不支持四、C的输入&a…

考虑实时市场联动的电力零售商鲁棒定价策略(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

JavaEE初阶第三课:网络初识

欢迎来到javaee初阶的第三课&#xff0c;这节课我会带大家来初识网络 荔枝目录1.认识IP和端口1.1 IP1.2端口2.认识协议2.1协议分层&#xff08;TCP/IP协议&#xff09;2.2封装与分用2.3两台主机之间的网络通信流程&#xff08;非同一网段&#xff09;3.其他常见名词 解释3.1客户…

电脑老是蓝屏是什么原因?怎么修复蓝屏

电脑老是蓝屏是什么原因&#xff1f;其实电脑蓝屏的原因是有很多种的&#xff0c;每个地方出问题都会导致电脑蓝屏&#xff0c;所以我们要想知道蓝屏的原因&#xff0c;那么就需要一步步的去检测&#xff0c;去排除掉一些可能&#xff0c;才能得出正确的蓝屏原因的答案。 一.什…

MATLAB 数组计算

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Java字典注解的简单实现(AOP)

需求来源 在开发过程中&#xff0c;必不可少会用到字典&#xff0c;例如&#xff0c;数据库字段性别字段可能是这样的&#xff1a;1&#xff1a;男&#xff1b;2&#xff1a;女&#xff0c;在数据存储的时候用1和2&#xff0c;但是在前端展示的时候需要使用男和女&#xff0c;…

有没有人像我一样每次面对sql都很痛苦

今天又操作了一遍sql&#xff0c;这世界上有没有人像我一样&#xff0c;每一次面对mysql都是一次痛苦的经历。 不知道别人怎么想&#xff0c;反正我是这样的。使用mysql从来没有让我快乐过。在数据库里面&#xff0c;最喜欢mongo&#xff0c;当然我也只会mongo。但是每一次使用…

NL-meals、BM3D

常用的高斯滤波或者均值滤波相对都比较简单&#xff0c;即每个窗口的滤波核都是一样的。稍微复杂一些保边滤波如&#xff0c;双边滤波和导向图滤波等。这里介绍几种ffmpeg里面包含的相对比较复杂的滤波算法。计算量不可谓不小。可以通过ffmpeg查看源码实现过程&#xff0c;这里…

RHCE(防火墙)

文章目录一、什么是防火墙二、iptables三、firewalld四、作业一、什么是防火墙 防火墙&#xff1a;防火墙是位于内部网络和外部网络之间的屏障&#xff0c;它按照系统管理员预先定义的规则来控制数据包的进出 防火墙可以分为硬件防火墙和软件防火墙。硬件防火墙是由厂商设计好的…

LongAdder/LongAccumulator类分析

一、LongAdder简介 1.下图是JDK-API文档的的截图信息 我们可以得知这两个类都是1.8开始提供的&#xff0c;并且都具有顶级的并发性。这两类的区别点主要在于LongAdder初始值为0&#xff0c;只能做累加操作&#xff0c;而LongAccumulator可以完成一些复杂的计算&#xff0c;本…

软件设计师考试整理-0-前言

1. 整理初衷 2022年下半年的软考成绩出来了&#xff0c;查了一下&#xff0c;上午58分&#xff0c;下午61分&#xff0c;虽然不高&#xff0c;但是也过了&#xff0c;还是值得开心的&#xff0c;毕竟在最初报考的时候&#xff0c;会的知识点寥寥无几。 先解释下为什么我会报考…

富勒烯C60,131159-39-2,水溶性富勒烯,CARBON C60

产品描述&#xff1a;富勒烯C60与金刚石、石墨是碳的三种同素异形体&#xff0c;富勒烯分子是一种由60个碳原子结合形成的稳定分子&#xff0c;它具有60个顶点和32个面&#xff0c;其中12个为正五边形&#xff0c;20个为正六边形&#xff0c;它形似足球&#xff0c;所以又称为富…

OpenMMLab AI实战营Day2 图像分类

目录 一、图像分类 二、卷积神经网络 三、超越ResNet的图像分类模型 1、神经结构搜索 2、Transformer 3、ConvNext 四、轻量化神经网络 五、Vision Transformer 六、模型学习 七、学习率与优化器调整策略 八、数据增强 一、图像分类 图像分类&#xff1a;识别图像中…