2013-06-04 28 views
5

经过一番努力,我设法建立了一个PHP多线程服务器,该服务器接收来自多个WebSocket的输入并将其传递给单个TCP套接字。 我用pthreads实现了这一点,并设法将Stackable对象用作数组。Threads,Workers,Mutex,Stackable之间的区别?

下一步现在是真正了解我在做什么和最肯定是我可以做的更好。我在这里读了一些关于多线程并不是你只是'做'的东西。出于这个原因,在继续编码之前,我想先深入研究。 带我到这些问题:

什么是A Worker Thread has a persistent statepthreads.org)。工作人员在超出范围时会继续运行吗?他们与Stackables的关系是什么?

PHP手册说工作线程应该用于线程,为什么?

我希望我的问题不是很广泛。

回答

13

工作者线程具有持久状态:当你开始工作线程,工人可用于执行,直到变量超出范围或工人处于停机状态。

举一个脚本示例,该脚本可以从多个来源联机下载多个页面:在很小的范围内,您可能会摆脱困境,它可能是拥有多个线程的最佳设计,每个线程处理单个请求并处理内容。但是,通常情况下,开始一个线程发出一个请求或者执行任何非常简单的操作,您应该认为这是一项巨大的浪费,相反,您可以启动尽可能多的工作人员,因为您的硬件和环境可以管理,并实现请求和处理内容作为一个Stackable。使用Worker时,每个请求不会花费您对线程上下文的初始化。在这种情况下的持久性是指每个Stackables可以读取$ this-> worker,并访问所有/任何全局(包括类级静态变量)作用域,因此从Stackable的角度来看,在执行期间工人坚持,实际上Stackables只是共享一个上下文。

互斥和电导率是有铁杆POSIX线程成瘾者,以及并行线程本身的发展过程中我的目的。普通用户不应该真的需要使用这个功能,尽管它与对应的posix函数一样都有文档记录,并且大部分原始文档仍然适用(顶层有一层明智的文档)。 Mutex和Cond都是熟悉功能的精简包装,并不是真正针对Joe Bloggs。

我想如果互斥体,以便有安全的阅读和对象的写作需要你想知道,这是不是这样,安全性被内置到并行线程。

你应该使用一个工作线程的时间将是;从这个例子来看,它的规模很小。此外,如果您有硬件来支持它,线程可以创建工人(和线程),这可以为更复杂的系统设计提供可能性。在这种情况下,你也可能会变得很棒,在这种情况下,你可以将你的线程编程为像工作人员一样工作,而不需要为每个任务开始对象初始化(堆栈)。 Worker是一个线程,只有Thread的某些功能被用来执行一个Stackables的列表,你会注意到Thread和Worker的同步方法的细微差别,如果你按照预期使用工作者,这并不重要。但是,如果您的真棒导致您认为避免使用标准模型会更好,那么您将需要来自Thread对象的同步来实现PHP中的Worker模式。

事实是,如果你正在寻找线程,你一次只想做两到三件事情,那么你很可能会找到办法做一些事情。因此,提供Worker/Stackable功能作为pthreads包的一部分是有意义的,因为它更适合在不同的上下文中执行一堆事情,所以在PHP中编写这些东西(即使在pthread的帮助下)也是非常棘手的。

+0

谢谢!这是一个巨大的帮助。尽管我的代码正在工作,但我的方式并不顺利。我仍然想知道什么时候可以使用纯色的Thread对象。 – marlonp33

+1

好的,我更新了线索上的一些关于...的信息,希望能够完全回答你的问题。 –

+0

我不得不多次阅读这些内容才能理解你的意思。但是谢谢! – Nerrve