【发布时间】:2015-08-18 06:50:55
【问题描述】:
我有一个脚本,它通过一个目录运行,并在所有具有给定结尾(即 .xml)的文件中搜索给定的字符串并替换它们。为此,我使用了 python 多处理库。
例如,我使用了 1100 个 .xml 文件,其中包含大约 200MB 的数据。在我的 MBP '15 15" 上,完整的执行时间是 8 分钟。
但是几分钟后,我在“顶部”看到的进程将进入睡眠状态(这里是 7m 之后......)。
顶部输出
PID COMMAND %CPU TIME #TH #WQ #PORT MEM PURG CMPR PGRP PPID STATE BOOSTS %CPU_ME %CPU_OTHRS
1007 Python 0.0 07:03.51 1 0 7 5196K 0B 0B 998 998 sleeping *0[1] 0.00000 0.00000
1006 Python 99.8 07:29.07 1/1 0 7 4840K 0B 0B 998 998 running *0[1] 0.00000 0.00000
1005 Python 0.0 02:10.02 1 0 7 4380K 0B 0B 998 998 sleeping *0[1] 0.00000 0.00000
1004 Python 0.0 04:24.44 1 0 7 4624K 0B 0B 998 998 sleeping *0[1] 0.00000 0.00000
1003 Python 0.0 04:25.34 1 0 7 4572K 0B 0B 998 998 sleeping *0[1] 0.00000 0.00000
1002 Python 0.0 04:53.40 1 0 7 4612K 0B 0B 998 998 sleeping *0[1] 0.00000 0.00000
所以现在只有一个进程在完成所有工作,而其他进程在 4 分钟后进入休眠状态。
代码 sn-p
# set cpu pool to cores in computer
pool_size = multiprocessing.cpu_count()
# create pool
pool = multiprocessing.Pool(processes=pool_size)
# give pool function and input data - here for each file in file_list
pool_outputs = pool.map(check_file, file_list)
# if no more tasks are available: close all
pool.close()
pool.join()
那么为什么所有进程都进入休眠状态?
我的猜测:文件列表与池中的所有工作人员分开(每个工作人员数量相同),其中一些只是“幸运”获得小文件 - 因此更早完成。这是真的吗?我只是在想它更像一个队列,这样每个工作人员在完成后都会得到一个新文件 - 直到列表为空。
【问题讨论】:
-
你猜对了:见documentation
标签: python multithreading replace multiprocessing cpu-usage