Threads,Workers,Mutex,Stackable之间的区别?

时间:2013-06-04 09:44:34

标签: php pthreads

经过一番努力,我设法建立了一个PHP多线程服务器,它接收来自多个WebSockets的输入并将其传递给单个TCP套接字。 我用pthreads完成了这个并设法使用Stackable对象作为数组。

现在的下一步是真正了解我正在做的事情,而且绝对是我能做得更好的事情。我在这里读到的地方就是多线程不是你'做'的事情。出于这个原因,我想在进行编码之前先深入挖掘。 让我谈谈这些问题:

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

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

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

1 个答案:

答案 0 :(得分:13)

工作线程具有持久状态:当您启动工作线程时,工作程序可以执行,直到变量超出范围或工作程序关闭。

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

Mutex和Cond用于核心posix线程成瘾者,并且在我开发pthreads本身时也是如此。普通用户不应该真正必须使用此功能,尽管它与对应的posix函数一样具有文档记录,并且许多原始文档仍然适用(顶层有一层敏感)。 Mutex和Cond都是熟悉功能的薄包装,而不是真正针对Joe Bloggs。

我猜你想知道是否需要使用互斥锁才能安全地读取和写入对象,但事实并非如此,pthreads内置了安全性。

你应该使用一个线程超过一个工人的时间;从这个例子来看,在很小的范围内。此外,如果您有支持它的硬件,Threads可以创建Workers(和Threads),这有助于更复杂的系统设计可能性。您可能也会对此感到非常棒,在这种情况下,您可以将线程编程为像工作者一样,而不会为每个任务执行对象初始化(可堆叠)的开销。 Worker是一个Thread,只有一些Thread的功能被高举以执行Stackables列表,你会发现Thread和Worker的同步方法有细微差别,如果不是你按预期使用工人。但是,如果您的精彩程度导致您认为避免使用标准模型会更好,那么您将需要从Thread对象进行同步以在PHP中实现Worker模式。

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