gpt4 book ai didi

php - 为什么 PHP pcntl_fork 不能并行运行两个以上的子进程?

转载 作者:行者123 更新时间:2023-12-05 02:27:45 26 4
gpt4 key购买 nike

我理解 fork() 是如何在高层次上工作的以及 pcntl_fork() 包装器,但是出于某种原因在我的环境中 PHP 只运行 两个子一次处理。以这个简单的代码为例:

<?php
for ($i = 1; $i <= 5; ++$i) {
$pid = pcntl_fork();
if ($pid === -1) {
print "Could not fork!\n";
exit(1);
}
if (!$pid) {
print "-In child $i\n";
sleep(1);
print "In child $i\n";
exit($i);
} else {
print "Parent: forked $i\n";
}
}

while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
echo "Child $status completed\n";
}

我期望的输出是这样的,总时间大约为 1 秒:

Parent: forked 1
-In child 1
Parent: forked 2
-In child 2
Parent: forked 3
-In child 3
Parent: forked 4
-In child 4
Parent: forked 5
-In child 5
In child 1
In child 2
In child 3
In child 4
In child 5
Child 1 completed
Child 2 completed
Child 3 completed
Child 4 completed
Child 5 completed

但我实际得到的是这样的,总执行时间约为 3.5 秒:

Parent: forked 1
Parent: forked 2
Parent: forked 3
Parent: forked 4
Parent: forked 5
-In child 2
-In child 1
In child 2
Child 2 completed
-In child 3
In child 1
Child 1 completed
-In child 4
In child 3
Child 3 completed
-In child 5
In child 4
Child 4 completed
In child 5
Child 5 completed

所以看起来在任何给定时间实际上只有两个子进程在运行。我找不到对此行为的任何解释...

在本地 Linux 主机上的 Docker 生产系统上运行测试时,我得到了预期的结果,但为什么我不能在我的 WSL2 主机上使用完全相同的容器重现它?

系统信息

  • 我在 Windows 11 上通过 WSL2 在最新版本的 Docker Desktop 中运行此测试。
  • 我的系统有 12 个 CPU 内核(20 个具有超线程 - nproc 从 WSL2 主机和 docker 容器内部打印“20”)。
  • 我没有更改 Docker Desktop 或 WSL 配置中的默认值,也没有在 Docker 容器上使用任何资源控制标志,因此不应以任何方式限制 CPU。

最佳答案

在原生 Linux 机器 (i3-6100) 上运行这个......

Parent: forked 1
-In child 1
Parent: forked 2
-In child 2
Parent: forked 3
-In child 3
Parent: forked 4
-In child 4
Parent: forked 5
-In child 5
In child 1
In child 2
In child 3
In child 4
In child 5
Child 3 completed
Child 4 completed
Child 5 completed
Child 1 completed
Child 2 completed

如果它的表现完全符合您的预期,我会感到很惊讶。当一个进程 fork 时,它会创建 2 个可运行的进程....至于哪个进程先被调度....使用 CFS,它们可能会与同一个核心保持关联....但它仍然有效 随机。并且 PHP 在启动时确实有很多工作要做(包括会导致让出 CPU 的东西)——尽管 fork 应该意味着大部分工作都可以被简化。然后是缓冲区刷新到 tty 的顺序。

话虽如此,您的结果与您的预期相差。这似乎是 MS-Windows 调度程序(IME 非常不稳定)的结果。

关于php - 为什么 PHP pcntl_fork 不能并行运行两个以上的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72948108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com