python多进程反而慢,python运行两个进程-凯发体育客户端

空空 2023-02-22 22:46:47 生活百科 793 ℃ 0 评论

想必现在有很多小伙伴对于python运行两个进程这方面的内容都很感兴趣,现在小王就为大家收集了一些关于python多进程反而慢相关的信息分享给大家,希望能够解答大家的问题。

很多时候,当我们需要使用python处理大量数据时,为了缩短处理时间,我们会使用多线程或者多进程来并行处理任务。

由于python全局解释器锁的存在,执行多线程时实际运行的只有一个线程,使得多核cpu无法发挥其真正的效率。多流程可以很好的解决这个问题。如果用错误的姿势打开多进程,会比单进程慢。下面我们来看看如何正确打开一个多进程。

这个例子是基于python对图片进行预处理。

这里我们直接通过循环调用图像的预处理函数,实际上是一个单独的过程。处理了1349张图像,用了将近10s。这里,为了方便,我不使用多次调用来平均。如果想计算的更准确,可以用average。

实际上用了将近13s,用了四道工序。原则上是否不科学?四个流程的处理速度应该比单个流程快,但是现在好像更慢了。也就是说,我们花了更多的硬件资源,但更多的时间。这是为什么呢?

接下来,我们来看看。我们使用队列来改进多进程图像的预处理。

令人惊讶的是,当我们将进程池改为根据进程数量分配任务时,速度提高了近一倍。

注意:其实这里用多线程会比多进程更快,消耗的资源也更少。这个例子只是为了说明影响多进程速度的原因。

缓慢的进程池可能有几个原因:

上例中,其实影响多进程速度的主要原因是每次调用预处理函数都会返回一个图像数组,占用大量内存。如果你把图像数组的返回值改成字符串,你会发现最后它们的速度会差不多。

那为什么使用队列的速度比进程池快那么多?这主要是由于存储在进程池和队列中的数据之间的差异。

虽然,我们以异步的方式使用进程池。但进程池在接受返回结果时使用self.wait(timeout),进程池最终返回结果的顺序与调用一致。queue保存数据的时候是通过后台线程写数据的,所以它最终的保存结果是乱序的,速度相对会快一些。

参考:1。https://stackoverflow.com/questions/20727375/,https://docs.python.org/zh-cn/3/library/multiprocessing.html2.多处理池比普通函数慢3。https://gist.github.com/michaelcurrie/314d664ccaaadde8a7e84.https://stackoverflow.com/问题/43439194/python-多处理-队列对多处理-管理器-队列

本文tag:[两个]

网站地图