题目:有一个超级大的int数组要求和,假设有100W,写一个php脚本, 根据当前机器(假设是多核的)cpu的核数,fork出这么多子进程,把数组平分,每个子进程计算其中一部分,并把结果保存到/tmp/子进程pid.txt. 最后父进程汇总...
题目:
有一个超级大的int数组要求和,假设有100W,写一个php脚本, 根据当前机器(假设是多核的)cpu的核数,fork出这么多子进程,把数组平分,每个子进程计算其中一部分,并把结果保存到/tmp/子进程pid.txt. 最后父进程汇总并输出求各结果.
思路分析:
使用pcntl扩展提供的pcntl_fork,pcntl_waitpid,posix_getpid等函数实现fork子进程,等待子进程退出,获取当前进程pid等功能。
代码实现:
<?php $count = 8; $arr = []; $max = 1000000; for($i = 0; $i < $max; $i++){ $arr[$i] = $i; } function sum(&$a,$s,$e){ $pid = posix_getpid(); $sum = 0; while($s <= $e){ $sum += $a[$s++]; } file_put_contents("/tmp/{$pid}.txt",$sum); return $sum; } $step = $max/$count; $s = 0; $children = []; for($j = 0; $j < $count; $j++){ $pid = pcntl_fork(); $e = ($j == $count-1) ? $max-1 : $s+$step-1; if($pid == -1){ echo "fork error\n"; }elseif($pid == 0){ $res = sum($arr,$s,$e); echo posix_getpid(),": ",$s,"--",$e,"=",$res,"\n"; exit; }else{ $s = $e + 1; $children[] = $pid; } } $status = null; $sum = 0; while(count($children) > 0){ $pid = array_shift($children); pcntl_waitpid($pid,$status); $sum = $sum + intval(file_get_contents("/tmp/{$pid}.txt")); } echo "sum=$sum\n";
执行效果:一定要开启pcntl扩展
沃梦达教程
本文标题为:PHP练习题:进程
基础教程推荐
猜你喜欢
- PHP实现Redis单据锁以及防止并发重复写入 2022-10-12
- PHP中的错误及其处理机制 2023-06-04
- thinkphp3.2.3框架动态切换多数据库的方法分析 2023-03-19
- PHP获取MySQL执行sql语句的查询时间方法 2022-11-09
- php array分组,PHP中array数组的分组排序 2022-08-01
- laravel ORM关联关系中的 with和whereHas用法 2023-03-02
- 使用PHP开发留言板功能 2023-03-13
- PHP命名空间简单用法示例 2022-12-01
- 在Laravel中实现使用AJAX动态刷新部分页面 2023-03-02
- laravel 解决多库下的DB::transaction()事务失效问题 2023-03-08