【问题标题】:Php: when to use pthreadphp:何时使用 pthread
【发布时间】:2012-12-17 02:15:57
【问题描述】:

我对使用线程了解不多,但我研究了 php 的 pthreads,它看起来非常有趣和简单,或者比我想象的更容易......

我搜索了示例并查看了文档,但我找不到任何实际示例说明何时使用线程实际上是有益的,这肯定是用于不依赖于彼此的长任务,例如执行许多任务http 请求或发送邮件。

但是呢? 写日志条目? 插入数据库? (比如跟踪用户活动) 从数据库中获取(我可以从线程中返回数据吗?)

这会提高性能还是创建线程的开销太大? (虽然我也可以使用工作池来减少开销,但我认为......)

非常感谢任何建议或示例!

【问题讨论】:

  • php 不是多线程的,而且很可能永远不会。它的许多内部库和附加组件都不是线程安全的。您可以通过 fork、exec、popen 等生成 php 副本来“伪造”线程。但它们不是真正的线程,并且开销大大超过了您可能希望获得的任何微观收益。
  • php 不是多线程的,但看起来有一个 pecl 扩展可以提供 php 多线程功能,github.com/krakjoe/pthreads 似乎是合法的
  • 将线程用于数据库时要小心:由于每个线程都创建自己的 MySql 资源,您会突然发现自己处于事务之外。
  • PHP 的内部框架十多年来一直是线程安全的。扩展需要时间来适应,但所有最新的扩展也是线程安全的。照搬旧评论和过时的狂热粉丝没有任何好处。
  • 如果我没记错的话,扩展必须是线程安全的才能被 PHP 正式支持。 TSRM 最终确定并完全集成到 PHP 中已经有很长时间了。具体来说,线程安全 Windows 发行版中包含的所有扩展在其核心上都是线程安全的。是的,这是所有主要扩展。

标签: php multithreading pthreads die


【解决方案1】:

发行版中包含许多示例,可在 github 上找到:

https://github.com/krakjoe/pthreads/tree/master/examples

这些示例包括通用线程池、多线程套接字服务器和 SQLWorker。

pthreads 创建的线程与 Zend 本身为通过多线程 SAPI 为请求提供服务的线程一样健全和安全。它们兼容所有相同的功能,以及您对高级线程 API 的所有期望(几乎)。

在无共享架构的深处实现线程总是有限制的,但是在使用更好的物理资源方面的好处,以及 PHP 对任何给定任务的整体可用性都远远超过在这种环境下工作的开销。

pthreads 中包含的对象与任何其他 PHP 对象一样工作,您可以从任何引用该对象的上下文中读取、写入和执行它们的方法。

您的思路完全正确:衡量效率的标准不是应用程序执行的线程数量,而是如何利用这些线程来最好地服务于应用程序的主要目的。工人是个好主意,无论你在哪里可以使用它们。

关于您询问的具体问题,LoggingWorker 是一个好主意并且可以工作,不要尝试共享该流,因为没有意义,如果 Worker 打开日志文件,它将非常稳定,或者由它执行的数据库连接和堆栈可以访问它们。 SQLWorker 也包含在示例中,这也是 API 缺乏体面的异步 API 的另一个好主意,或者您只是更喜欢多线程编程流程。

您不会得到更好或更正确的答案:我自己编写了 pthreads。

【讨论】:

  • 谢谢 :) 我不是小丑,pthreads 面对互联网上数量惊人的内容,坦率地说,这是错误的。如果人们所说的关于 PHP 及其线程安全性或可靠性的任何事情是真实的,那么 pthreads 根本就无法工作。当面对事实时,我们不明白要做的是研究,而不是重复你曾经读过的关于一个主题的所有内容,然后把它当作一个答案来总结。我很失望,一个拥有如此多积分的人认为没有必要比过去看得更远......
  • @JoeWatkins 我指的是对你的答案投了反对票的人(到底是谁投了反对票?——查尔斯和我回答说......这个人一定是个小丑)......干得好Joe 感谢pthreads 和为PHP 增加价值......我期待听到这将成为核心PHP 的一部分......很好
  • 哦,我对投了这么多努力帮助的人投了反对票,我感到很冷,对此我确实觉得有点像小丑,但希望这是可以理解的......我解释了过去,设计,在以下答案中详细介绍了实现和含义:@ 987654322@ 事实上,它可能永远不会包含在核心中(apc 也不是,别忘了集成不需要包含在核心中),这是一个基本原理其中看到我也链接过的帖子。谢谢你的客气话。
  • 我真的认为你应该用一些真实的例子和用例来更新 PHP 文档 .. 这样更多的人可以使用并且从反馈中 lib 变得更好......别担心我让人们知道这件事......
  • @joe 感谢您的精彩扩展。也许这些例子可以进入官方 php.net 文档?
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 2017-01-02
  • 2016-04-29
  • 2016-11-06
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
相关资源
最近更新 更多