Python多处理脚本的运行速度比原始脚本慢

时间:2018-12-01 03:20:28

标签: python multithreading multiprocessing

我在StackOverFlow上阅读了很多线程,以试图了解为什么我的多重处理无法正常工作。

我需要从文件中获取IP,对其进行处理,然后将其写入文件。我的处理过程涉及大量字典搜索,是最耗时的部分。

要进行故障排除,我在两个脚本(即常规脚本和多处理脚本)上使函数休眠了1/10秒,当我这样做时,我的多处理脚本实际上快5倍。这样,我可以得出结论,我的多处理程序实际上正在工作。

以下代码的运行速度提高了5倍(考虑到我在两个脚本上都添加了time.sleep(0.1)行):

from multiprocessing.dummy import Pool
import time

def main(argv):
    *bunch of code calling processFunction*

def processFunction():
    pool = Pool(10)
    results = pool.map(processIP, ipList)
    print(results)
    pool.close()
    pool.join()

def processIP():
    time.sleep(0.1)

原始代码包含一个 for 循环,而不是多处理。 我的问题是,如果删除time.sleep(0.1)(两个都删除),我的脚本实际上要比原始脚本花费2到3秒钟。 你知道为什么吗?

预先感谢您的帮助

PS:我知道我实际上正在使用多线程。该脚本假定可以处理大约25k IP的列表

1 个答案:

答案 0 :(得分:0)

Python(至少是CPython实现)不适用于多线程处理,因为global interpreter lock阻止了许多操作真正并行进行。 sleep例外是一种可以有效完成的操作。

因此,multiprocessing存在。但是multiprocessing.dummy只是多线程的后备,它只能使代码工作依赖于不支持它的系统上的多处理。

由于您的代码只是执行多线程,因此它在休眠时有效,而在工作时则无效。

要使代码在单个工作单元(此处为处理IP)不需要很多时间但单元数很高的情况下更有效,则应创建例如50个IP由子进程一次处理,以减少父子进程之间的通信开销。