标签:c-3 php fork process-management
编辑:我已经标记了这个C,希望得到更多回复.它比我特定的语言实现更感兴趣.因此,如果您是C编码器,请将以下PHP视为伪代码,并随时回答用C编写的答案.
我试图通过并行执行其任务而不是串行来加速PHP CLI脚本.任务完全相互独立,因此它们开始/结束的顺序无关紧要.
这是原始脚本(注意所有这些示例都是为了清晰起见而被剥离):
<?php
$items = range(0, 100);
function do_stuff_with($item) { echo "$item\n"; }
foreach ($items as $item) {
do_stuff_with($item);
}
我已设法使其与pcntl_fork()
并行的$项目工作,如下所示:
<?php
ini_set('max_execution_time', 0);
ini_set('max_input_time', 0);
set_time_limit(0);
$items = range(0, 100);
function do_stuff_with($item) { echo "$item\n"; }
$pids = array();
foreach ($items as $item) {
$pid = pcntl_fork();
if ($pid == -1) {
die("couldn't fork()");
} elseif ($pid > 0) {
// parent
$pids[] = $pid;
} else {
// child
do_stuff_with($item);
exit(0);
}
}
foreach ($pids as $pid) {
pcntl_waitpid($pid, $status);
}
现在我想扩展这个,所以最多有10个孩子一次活动.处理这个问题的最佳方法是什么?我尝试过一些东西,但运气不好.
解决方法:
没有系统调用来获取子pid列表,但ps可以为您完成.
–ppid switch会列出你所有的子进程,所以你只需要计算ps输出的行数.
或者,您可以维护自己的计数器,您将在fork()上递增并递减SIGCHLD信号,假设ppid保持不变以进行fork’ed处理.
标签:c-3,php,fork,process-management 来源: https://codeday.me/bug/20190827/1744150.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。