顺便记录一下:
import numpy as np
from time import time
from multiprocessing import Process, Queue
import multiprocessing as mp
import random
def my_func(x):
s0 = time()
res = 0
for _ in range(x*1000000):
res += 1
print(mp.current_process(),'run time:%.3f s, result:%.1f'%(time()-s0,res))
return res
'''
multiprocessing.Pool 只是用来启动多个进程而不是在每个core上启动一个进程。
换句话说Python解释器本身不会去在每个core或者processor去做负载均衡。
这个是由操作系统决定的。如果你的工作特别的计算密集型的话,操作系统确实会分配更多的core,但这也不是Python或者代码所能控制的或指定的。
multiprocessing.Pool(num)中的num可以很小也可以很大,比如I/O密集型的操作,这个值完全可以大于cpu的个数。
硬件系统的资源分配是由操作系统决定的,如果你希望每个core都在工作,就需要更多的从操作系统出发了~
这段话转自https://segmentfault.com/q/1010000011117956
'''
def main():
pool = mp.Pool(processes=mp.cpu_count())
st = time()
result = pool.map(my_func, [30]*8)
print('total run time: %.3f s'%(time()-st))
print(result)
if __name__ == "__main__":
main()
同样地看下输出:
run time:3.833 s, result:30000000.0
run time:3.806 s, result:30000000.0
run time:4.169 s, result:30000000.0
run time:4.149 s, result:30000000.0
run time:3.717 s, result:30000000.0
run time:3.682 s, result:30000000.0
run time:4.034 s, result:30000000.0
run time:3.960 s, result:30000000.0
total run time: 4.712 s
[30000000, 30000000, 30000000, 30000000, 30000000, 30000000, 30000000, 30000000]