首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PHP工作线程到Python线程

从PHP工作线程到Python线程
EN

Stack Overflow用户
提问于 2009-10-19 22:47:01
回答 3查看 951关注 0票数 3

现在,我在每台等待接收工作负载(作业)的机器上运行50个PHP (在CLI模式下)。例如,调整图像大小的工作。在工作负载中,它们接收图像(二进制数据)和所需的大小。工人完成它的工作,并返回调整大小的图像。然后它等待更多的工作(它以一种智能的方式循环)。我假设我有相同的可执行文件、库和类被加载和实例化50次。我说的对吗?因为这听起来不是很有效。

我现在想要的是一个能够处理所有这些工作的进程,并且能够使用所有可用的CPU核心,同时只加载一次所有内容(以提高效率)。我假设每个作业都会启动一个新的线程,在它完成后,线程就会停止。如果工作的线程少于50个,则会接受更多的作业。如果所有50个线程都很忙,则不接受任何额外的作业。

我使用了很多库(用于Memcached、Redis、MogileFS等)可以访问系统使用的所有不同组件,而Python几乎是除PHP之外唯一支持所有组件的语言。

Python能做我想做的事吗?它会比目前的PHP解决方案更快更高效吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-19 23:04:14

很有可能-是的。但不要假设你必须做多线程。看一下多处理模块。它已经包含了一个Pool的实现,这是您可以使用的。它基本上解决了GIL问题(多线程在任何时候只能运行1个“标准python代码”--这是一个非常简单的解释)。

它仍然会为每个作业派生一个进程,但方式不同于重新启动它。在进入工作进程之前完成的所有初始化和加载的库都将以写入时复制的方式继承。你不需要做更多的初始化,如果你没有让库/类与预池状态不同,你也不会浪费内存。

所以,是的-只看这一部分,python将浪费更少的资源,并将使用“更好的”工作池模型。如果不进行测试,或者至少看一下代码,就很难判断它是否真的会更快/更少地占用CPU。你自己试试吧。

补充:如果你担心内存使用,python可能也会对你有所帮助,因为它有一个“合适的”垃圾收集器,而在php中,垃圾收集器并不是一个优先事项,也不是很好(而且也有很好的理由)。

票数 4
EN

Stack Overflow用户

发布于 2009-10-19 22:59:44

Linux有共享库,所以这50个php进程大多使用相同的库。你听起来一点问题都没有。

“这听起来不是很有效。”不是一个问题描述,如果有什么不同的话,这些词本身就是一个问题。写代码需要一个真正的理由,否则你只是在浪费时间和/或金钱。

Python是一种优秀的语言,它的性能不会比php差。Python的multiprocessing模块可能也会有很大帮助。但是,如果php实现不是完全疯狂的话,那也没什么好处。那么,当一切都正常的时候,为什么还要花时间在它上面呢?这通常是目标,而不是重写的理由……

票数 4
EN

Stack Overflow用户

发布于 2009-10-19 22:56:37

如果你在一个正常的操作系统上,那么共享库应该只加载一次,并在使用它们的所有进程之间共享。数据结构和连接句柄的内存显然是重复的,但停止和启动系统的开销可能比在空闲时保持运行更大。如果您正在使用类似于gearman的工具,那么让几个worker即使空闲也保持不睡可能是有意义的,然后有一个持续的监视进程,如果所有当前worker都忙到某个阈值(比如可用CPU的数量),它就会启动新的worker。然后,这个过程可能会在工人空闲一段时间后以后进先出的方式杀死他们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1591555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档