Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP工作者到Python线程_Php_Python_Multithreading - Fatal编程技术网

从PHP工作者到Python线程

从PHP工作者到Python线程,php,python,multithreading,Php,Python,Multithreading,现在,我在每台等待接收工作负载(作业)的机器上运行50个PHP(在CLI模式下)单个工作进程(进程)。例如,调整图像大小的工作。在工作负载中,它们接收图像(二进制数据)和所需大小。工作进程执行其工作并返回调整大小的图像。然后它等待更多的作业(它以一种智能的方式循环)。我假设我有相同的可执行文件、库和类被加载并实例化了50次。我说得对吗?因为这听起来不是很有效 我现在想要的是一个处理所有这些工作的进程,能够使用所有可用的CPU内核,同时只加载一次所有内容(以提高效率)。我假设每个作业都会启动一个新

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

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

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


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

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

Linux拥有共享库,因此这50个php进程使用的库基本相同。 你听起来一点问题都没有

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


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

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

它仍然会为每个作业分叉一个过程,但方式不同于重新开始。在进入工作进程之前加载的所有初始化和库都将以写时复制的方式继承。如果没有使同一个库/类与池前状态有所不同,那么就不会进行过多的初始化,也不会浪费同一个库/类的内存

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


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

虽然这是真的,但它只适用于代码部分。假设所需的库分配X字节的私有数据,其中50%在执行过程中从未更改。50个php进程将共享代码+分配50*X。Python库将分配X,分叉后将仅使用(X/2+50*X/2),因为它还将共享未更改的数据。当然,百分比取决于图书馆。X可能非常接近于0,所以它可能没有什么区别,但otoh可能相当高。。。