码迷,mamicode.com
首页 > 系统相关 > 详细

进程池

时间:2018-09-20 21:53:10      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:join()   proc   利用   time   情况下   pen   提交   提高   衣服   

一、为什么要有进程池

   开启过多的进程并不能提高你的效率,反而会降低效率。

1.1 计算密集型

   充分占用CPU 多进程可以充分利用多核。适合开启多进程,但是不适合开启很多多进程。

1.2 IO密集型

   大部分时间都在阻塞对列中,而不是在运行状态中

   根本不太适合开启多进程

简单进程池的代码实现 ---->异步提交

from multiprocessing import Pool
def func(num):
    print(做了第%s间衣服%num)
if __name__ == __main__:
    p = Pool(4)
    for i in range(10):
         p.apply_async(func,args=(i,))  # 异步提交func到一个子进程中执行
    p.close()       # 关闭进程池,用户不能再向这个池中提交任务了
    p.join()           # 阻塞,直到进程池中所有的任务都被执行完

简单进程池的代码实现 ---->同步提交

from multiprocessing import Pool
def task(num):
    time.sleep(1)
    print(%s:%s%(num,os.getpid()))
    return num**2
if __name__ == __main__:
    p = Pool(4)
    for i in range(20):
        res = p.apply(task,args=(i,))  # 提交任务的方法 同步提交
        print(-->,res)    # 同步提交,有返回值

进程池---->异步提交,有返回值   # 通过 get()方法实现

from multiprocessing import Pool
def task(num):
    time.sleep(1)
    print(%s:%s%(num,os.getpid()))
    return num**2
if __name__ == __main__:
    p = Pool()
    res_lst = []
    for i in range(20):
        res = p.apply_async(task,args=(i,))  # 提交任务的方法 异步 提交
        res_lst.append(res)   # 对象(编号)
    for res in res_lst:
        print(-->,res.get())
实例化 传参数 进程的个数 cpu/cpu + 1
提交任务
同步提交 apply
返回值:子进程对应函数的返回值
一个一个顺序执行的,并没有任何并发效果
异步提交 apply_async
没有返回值,要想所有任务能够顺利的执行完毕
p.close()
p,join() # 必须先close再join,阻塞直到进程池中的所有任务都执行完毕
有返回值的情况下
res.get() # get不能再提交任务之后立刻执行,应该是先提交所有的任务再通过get获取结果
map()方法
import os
import time
from multiprocessing import Pool
def task(num):
    time.sleep(1)
    print(%s:%s%(num,os.getpid()))
    return num**2
if __name__ == __main__:
    p = Pool()
    p.map(task,range(20))
map()方法
异步提交的简化版本
自带close和join方法

进程池

标签:join()   proc   利用   time   情况下   pen   提交   提高   衣服   

原文地址:https://www.cnblogs.com/youhongliang/p/9683479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!