7

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

现在的下一步是真正了解我在做什么,并且最明确地了解我可以做得更好的地方。我在这里某处读到多线程不是你只是“做”的事情。出于这个原因,我喜欢在开始编码之前先深入挖掘。让我想到这些问题:

A Worker Thread has a persistent state( pthreads.org )是什么意思。当超出范围时,Worker 会继续运行吗?它们与 Stackables 有什么关系?

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

我希望我的问题不要太宽泛。

4

1 回答 1

14

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

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

Mutex 和 Cond 是为铁杆 posix 线程上瘾者而存在的,并且在 pthreads 本身的开发过程中也是为了我的目的。普通用户不应该真的必须使用此功能,尽管它与对应的 posix 函数一样有据可查,而且大部分原始文档仍然适用(顶部有一层 sensible)。Mutex 和 Cond 都是熟悉功能的薄包装,并不是真正针对 Joe Bloggs。

我猜你想知道是否需要互斥锁才能安全地读写对象,事实并非如此,安全性内置于 pthreads 中。

您应该在 Worker 上使用 Thread 的时间是;从这个例子来看,规模很小。此外,如果您有支持它的硬件,线程可以创建工人(和线程),这有助于更复杂的系统设计可能性。您也可能在这方面表现出色,在这种情况下,您可以将线程编程为像工作人员一样工作,而无需为每个任务初始化对象(可堆叠)。Worker 是 Thread,只有部分 Thread 的功能被劫持来执行 Stackables 列表,您会注意到 Thread 和 Worker 的同步方法的细微差别,如果您按预期使用 worker 无关紧要. 但是,如果您的出色表现使您认为最好避免使用标准模型,

事实是,如果您正在研究线程,您希望一次做 2 或 3 件以上的事情,那么您很可能已经找到了做一些事情的方法。因此,将 Worker/Stackable 功能作为 pthreads 包的一部分提供是有意义的,因为它更适合在单独的上下文中执行一堆东西,用 PHP 编写这些东西(即使在 pthreads 的帮助下)会很棘手。

于 2013-06-04T12:41:15.600 回答