我在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的列表
答案 0 :(得分:0)
Python(至少是CPython实现)不适用于多线程处理,因为global interpreter lock阻止了许多操作真正并行进行。 sleep
例外是一种可以有效完成的操作。
因此,multiprocessing
存在。但是multiprocessing.dummy
只是多线程的后备,它只能使代码工作依赖于不支持它的系统上的多处理。
由于您的代码只是执行多线程,因此它在休眠时有效,而在工作时则无效。
要使代码在单个工作单元(此处为处理IP)不需要很多时间但单元数很高的情况下更有效,则应创建例如50个IP由子进程一次处理,以减少父子进程之间的通信开销。