php - 从 PHP worker 到 Python 线程

标签 php python multithreading

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

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

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

Python 可以做我想做的事吗?它会比当前的 PHP 解决方案更快、更高效吗?

最佳答案

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

它仍然会为每个作业 fork 一个进程,但与重新开始它的方式不同。在进入工作进程之前完成的所有初始化和加载的库将以写时复制的方式继承。你不会做比必要更多的初始化,如果你实际上没有使它与池前状态不同,你也不会为同一个库/类浪费内存。

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

补充:如果你担心内存使用,python 也可以帮助你一点,因为它有一个“合适的”垃圾收集器,而在 php 中,GC 不是一个优先事项,也不是那么好(并且为了一个好的也是原因)。

关于php - 从 PHP worker 到 Python 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1591555/

相关文章:

Pythonlibs3 CMake 和 macOS

python - 在 python 包中添加和读取 config.ini 文件

C++创建线程报错?

php - 将 Magento 安装移动到新服务器

python - altair:在回归中访问 r 平方值

java - 当新的多线程消费者添加到组中时是否会发生重新平衡

ios - 如何在 Swift 3 中处理组等待结果

php - $_SERVER ['DOCUMENT_ROOT' ] 在末尾创建额外的斜杠

PHP - 给定 Boo 的可捕获 fatal error : Argument 1 passed to Too must be an instance of Foo, 实例?

PHP如何覆盖文件的特定部分