为什么在PHP中使用多线程不是一个好主意?

我知道php没有线程.但在本教程中,他们表明通过使用主机操作系统形成能力,我们可以实现它.它还说它不会在生产代码中这样做.为什么这不是一个好主意?

这是一个示例代码

$processID = pcntl_fork();
if($processID) {
     echo "I'm in the parent process!";
} else {
     echo "I'm in the child process!";
}

这是tutorial.

解决方法:

分叉是否创建了一个线程?

当我们分叉一个进程时,进程空间,也就是说进程所需的库和代码所在的内存区域是重复的,然后不同但相关的进程继续按照操作系统调度程序的意愿执行在不同的记忆区域.

分叉进程和线程有什么区别?

当我们创建一个Thread时,我们告诉操作系统我们想要另一个可以在与创建它的Process相同的内存区域中运行的执行单元.

不同的操作系统实际上如何实现线程和进程超出了这个答案的范围,并不重要.

为什么分叉在前端是个坏主意?

当您复制整个地址空间时,您复制了Web服务器正在运行的内存区域,这显然会对您的操作系统造成严重破坏.

为什么在前端遇到一个坏主意?

如果客户端脚本指示操作系统在直接响应Web请求时创建8个线程,并且100个客户端同时请求该脚本,那么您将指示操作系统同时执行800个线程.

CPU和操作系统需要看起来非常不同才能让它成为一个好主意!

在哪里有一个好主意?

多线程软件和功能非常强大的硬件无处不在;没有它,计算就不会是它.

在Web基础结构的上下文中,mysql和其他数据库服务器是多线程的,事实上Apache可以在多线程基础结构中部署PHP,但我不推荐它.

当我们看看像mysql这样有进取心的应用程序实际上如何提供极其复杂的服务时,我们可以看到它们的进程(以及线程)与Web应用程序的基础结构完全隔离.

这就是我们如何在支持它们的语言中使用Threads;我们设计的系统提供服务的方式是通过一些理智的IPC形式,我们完全将我们的复杂基础设施与简单的应用程序隔离开来:我们的Web应用程序.

PHP真的适合Threads吗?

PHP的内存模型没有任何共享:这意味着PHP需要操作的结构和内存意义上的每个解释器上下文都与任何其他上下文隔离.

这总是必须适用于PHP按预期工作; PHP的线程实现,不知道PHP工作的方式根本不起作用.

pthreads竭尽全力确保内存模型不被破坏,每个Thread确实不会直接与任何其他Thread共享内存.

线程真的适合我吗?

首先,认真思考以下问题:

>真的需要线程吗?
>您可以通过哪些其他方式来实现您打算做的任何事情?

多线程软件本质上是复杂的;在我看来,复杂的东西不是避免它的借口.

但请注意,多线程软件与普通PHP应用程序根本不同,您必须考虑以前从未考虑过的事情,在开始第一个Thread之前要注意一些无关紧要的事情.

你不应该猜测这些东西是什么,你应该尽可能彻底地教育自己,甚至准备好失败,坚持下去.

随着知识的增加,任何事物的复杂性都会降低,这就是学习的方式,这就是它开始的地方:

https://gist.github.com/krakjoe/6437782

在我看来,它继续在手册中,在使用pthreads分发的许多示例中,在*搜索和问题中,并导致荣耀.

上一篇:PHP多进程系列笔(转)


下一篇:[解题记录] P2894 [USACO08FEB]Hotel G