从PHP工作者到Python线程

时间:2009-10-19 22:47:01

标签: php python multithreading

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

我现在想要的是一个处理所有这些工作的过程,并且能够使用所有可用的CPU核心,同时只加载一次(为了更高效)。我假设将为每个作业启动一个新线程,并在完成后,线程将停止。如果执行工作的线程少于50个,则可以接受更多的工作。如果所有50个线程都忙,则不接受其他作业。

我使用了很多库(对于Memcached,Redis,MogileFS,...)来访问系统使用的所有各种组件,而Python几乎是唯一支持所有PHP的语言他们。

Python可以做我想做的事情吗?它会比现有的PHP解决方案更快更有效吗?

3 个答案:

答案 0 :(得分:4)

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

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

Python是一种优秀的语言,不会比php更差。 Python的multiprocessing模块可能也会有很大帮助。但是,如果php实现不完全疯狂,那么没有太大的收获。所以当一切正常时,为什么还要花时间去做呢?这通常是目标,而不是重写的理由......

答案 1 :(得分:4)

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

它仍然会为每个作业分配一个进程,但是以不同的方式再次启动它。在进入工作进程之前完成的所有初始化和库加载将以写时复制的方式继承。你不会做更多的必要的初始化,如果你没有真正使它与池前状态不同,你不会浪费相同的libarary /类的内存。

所以是的 - 只看这个部分,python将浪费更少的资源,并将使用“更好”的工作池模型。它是否真的会更快/更少CPU滥用,很难说没有测试,或至少看代码。亲自尝试一下。

补充:如果你担心内存使用,python可能也会帮助你一点,因为它有一个“正确的”垃圾收集器,而在PHP中GC不是一个优先级而不是那么好(并且为了一个好的)理由也是。)

答案 2 :(得分:1)

如果您使用的是理智的操作系统,则只应加载一次共享库,并在使用它们的所有进程之间共享。数据结构和连接句柄的内存显然会重复,但停止和启动系统的开销可能比空闲时保持正常。如果你正在使用像gearman这样的东西,那么让几个工人即使在闲置时仍然保持正常也是有意义的,然后有一个持久的监控过程,如果所有当前的工作人员都忙着,直到达到阈值,例如可用CPU的数量,这将启动新的工作人员。然后,这个过程可能会在闲置一段时间后以LIFO方式杀死工人。