赞
踩
主要在WIN系统下实现:
首先检查一下电脑的实际核心数目:
在cmd.exe 中输入wmic然后输入cpu ge NumberOfCores 读取系统核心数目。
使用Python代码检查核心数
import multiprocessing as mp
import math
if __name__ == '__main__':
numOfCore = int(mp.cpu_count())
print(str(numOfCore))
在电脑上的输出结果并非6核心,而是12,那这台电脑一个核心可以执行多个任务,并且是一台可以超线程的电脑。
下面的例子主要是用来了解一下进程调用函数的流程
下面的代码编译了几次感觉执行顺序都一样。
import multiprocessing as mp
def working(i):
print('Working process:%s' %i)
if __name__ == '__main__':
ProcessWorker = []
for i in range(12):
p = mp.Process(target=working,args=(i,))
ProcessWorker.append(p)
p.start()
p.join()
输出结果:
把它改成另外一种形式,明显的体会到有些进程会优先执行代码
import multiprocessing as mp
def working(i):
print('Working process:%s' %i)
if __name__ == '__main__':
ProcessWorker = []
for i in range(12):
p = mp.Process(target=working,args=(i,))
ProcessWorker.append(p)
p.start()
for i in range(12):
p.join()
输出结果
Pool类可分为同步和异步
同步执行函数
1)Pool.map()
2)Pool.startmap()
3)Pool.apply()
异步执行函数
1)Pool.map_async()
2)Pool.startmap_async()
3)Pool.apply_async()
import multiprocessing as mp
import math
def calculate(r):
return r*r*math.pi
if __name__ == '__main__':
with mp.Pool(8) as p:
print(p.map(calculate,[1,3,5,7,9]))
p.close();
运行结果
适合用于分而治之
并行计算需要知道怎么使用map 和 reduce
import multiprocessing as mp
from functools import reduce
import math
def sum(x,y):
return x+y;
def calculate(r):
return r*r*math.pi
if __name__ == '__main__':
with mp.Pool(8) as p:
result=(p.map(calculate,[1,3,5,7,9]))
p.close();
result1 = reduce(sum,list(result))
result2 = reduce(lambda x,y:x+y,list(result))
print(result1)
print(result2)
运行结果:
利用队列Queue来进行信息交互,注意这个Queue是Manager下面的Queue,如果跑不动是因为用错方法。
from multiprocessing import Process,Lock,Pool,Manager def put(value,q): q.put(value) print('put %s' % value) def get(q): while True: if not q.empty(): value = q.get() print('get %s' % value) else: break if __name__=='__main__': m = Manager() q = m.Queue() pool = Pool(processes=6) for num in range(6): pool.apply_async(put,(num,q,)) pool.close() pool.join() pget = Process(target=get,args=(q,)) pget.start() pget.join()
运行结果:
当遇到资源抢占的情况,使用锁是最好的方法。有个程序不用锁等了2分钟才执行完,加了锁,需要排队等待资源反而使效率更高。
from multiprocessing import Process,Lock,Pool,Manager lock = Lock() def put(value,q): lock.acquire() q.put(value) print('put %s' % value) lock.release() def get(q): while True: if not q.empty(): value = q.get() print('get %s' % value) else: break if __name__=='__main__': m = Manager() q = m.Queue() pool = Pool(processes=6) for num in range(6): pool.apply_async(put,(num,q,)) pool.close() pool.join() pget = Process(target=get,args=(q,)) pget.start() pget.join()
输出结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。