我遵循了这个很好的教程,展示了如何将多个映射实例作为进程运行。然而,在python 3.4.3/Windows 7 x64上,任何时候都使用单核。
from multiprocessing import Pool
from itertools import repeat
import random
import time
def Map(L):
return len(L)
def Main():
pool = Pool()
lst = [random.sample(range(1, 100), random.randint(1, 50)) for i in repeat(None, 1000000)]
start_time = time.time()
counts = pool.map(Map, lst)
print(time.time() - start_time)
if __name__ == '__main__':
Main()
在Linux (vmware ubuntu guest machine)中,相同的脚本显示处理器100%繁忙。
是否有任何技巧强制Windows运行脚本与真正的并行?
这里的多进程特性在Windows上也像预期的那样工作。然而,lst
的生成需要很多时间(在Windows上比在Linux上多几倍)。
在任务管理器中可以看到,脚本运行时有5个python.exe
进程。首先,其中一个使用25%的CPU,其内存使用缓慢增加。大约需要一分钟。
那么其他4个进程占用CPU。这里pool.map()
是启动的。然而,它只持续几秒钟。所以,看起来好像所有的事情都只在一个进程中完成。
要在Windows上看到多进程的作用,将lst
减少十倍并在Map(L)
函数中放入一些循环以使其使用更多的时间是有意义的,例如:
def Map(L):
ret = 0;
for i in range(5000):
ret += len(L)
ret %= 50
return ret
def Main():
pool = Pool()
lst = [random.sample(range(1, 100), random.randint(1, 50)) for i in repeat(None, 100000)]
print("Start")
start_time = time.time()
#...