python实现多进程
这里的Queue()很重要,通过每个进程计算得到的结果通过Queue储存,计算结束通过Queue取出
#该函数没有返回值!!!
def job(q):
res=0
for i in range(1000):
res+=i+i**2+i**3
q.put(res) #queue
if __name__=='__main__':
q = mp.Queue()
#定义两个线程函数,用来处理同一个任务, args 的参数只要一个值的时候,
#参数后面需要加一个逗号,表示args是可迭代的,后面可能还有别的参数,不加逗号会出错
p1 = mp.Process(target=job,args=(q,))
p2 = mp.Process(target=job,args=(q,))
#分别启动和加入两个进程
p1.start()
p2.start()
p1.join()
p2.join()
#从Queue中读取计算结果
res1 = q.get()
res2 = q.get()
print(res1+res2)
进程池Pool
有了池子之后,就可以让池子对应某一个函数,我们向池子里丢数据,池子就会返回函数返回的值。 Pool和之前的Process的不同点是丢向Pool的函数有返回值,而Process的没有返回值。
用map()获取结果,在map()中需要放入函数和需要迭代运算的值,然后它会自动分配给CPU核,返回结果
apply_async()
Pool除了map()外,还有可以返回结果的方式,那就是apply_async().
apply_async()中只能传递一个值,它只会放入一个核进行运算,但是传入值时要注意是可迭代的,所以在传入值后需要加逗号, 同时需要用get()方法获取返回值
import multiprocessing as mp
def job(x):
return x*x
def multicore():
pool = mp.Pool(processes=2)
res = pool.map(job, range(10))
print(res)
res = pool.apply_async(job, (2,))
print(res.get())
multi_res =[pool.apply_async(job, (i,)) for i in range(10)]
print([res.get() for res in multi_res])
if __name__ == '__main__':
multicore()
参考:莫烦python
1596

被折叠的 条评论
为什么被折叠?



