gpt4 book ai didi

php - 线程, worker ,互斥锁,可堆叠之间的区别?

转载 作者:可可西里 更新时间:2023-11-01 13:11:16 25 4
gpt4 key购买 nike

经过一些努力,我设法设置了一个 PHP 多线程服务器,它从多个 WebSockets 接收输入并将其传递到单个 TCP 套接字。我使用 pthreads 完成了这项工作,并设法将 Stackable 对象用作数组。

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

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

PHP 手册说应该使用工作线程而不是线程,为什么?

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

最佳答案

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

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

Mutex 和 Cond 是为铁杆 posix 线程爱好者准备的,也是我在 pthreads 本身开发期间的目的。普通用户实际上不必使用此功能,尽管它与对应的 posix 函数一样有详细的文档记录,并且许多原始文档仍然适用(在顶部有一层合理的)。 Mutex 和 Cond 都是熟悉功能的薄包装,并不是真正针对 Joe Bloggs。

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

您应该在 Worker 上使用 Thread 的次数;从这个例子来看,在很小的范围内。此外,如果您有支持它的硬件,Threads 可以创建 Worker(和 Threads),这有助于实现更复杂的系统设计可能性。你也可能在这方面表现出色,在这种情况下,你可以将你的线程编程为像工作人员一样工作,而无需为每个任务进行对象初始化(可堆叠)的开销。 Worker 是一个 Thread,只有 Thread 的一些功能被劫持来执行 Stackables 列表,您会注意到 Thread 和 Worker 的同步方法存在细微差别,如果您按预期使用 worker,这并不重要.但是,如果您的超凡能力让您认为最好避免使用标准模型,那么您将需要从 Thread 对象进行同步以在 PHP 中实现 Worker 模式。

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

关于php - 线程, worker ,互斥锁,可堆叠之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914580/

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