zoukankan      html  css  js  c++  java
  • (7)Pool进程池

    (1)# 开启过多的进程并不一定提高你的效率

    因为进程池可以实现并行的概念,比Process单核并发的速度要快

    # 如果cpu负载任务过多,平均单个任务执行的效率就会低,反而降低执行速度.

    1个人做4件事和4个人做4件事

    显然后者执行速度更快,

    前者是并发,后者是并行

    利用进程池,可以开启cpu的并行效果

    # apply 开启进程,同步阻塞,每次都要等待当前任务完成之后,在开启下一个

    进程,apply是同步阻塞,每个进程必须执行完,才能在开启进程;

    # apply_async 开启进程,异步非阻塞,(主进程 和 子进程异步)

    注意:进程池不需要start来开启

    (2)语法:from threading import Thread,Pool

    注意:不用写target

    p.apply(函数名,args=(参数)) 有返回值

    p.apply_async(函数名=(参数)) 有返回值,是一个[对象.get()]获取

    os.cpu_count() 获取cpu核心数

    p = Pool(6)

    (3)注意;两个要一起用

    关闭进程池,用户不能在向这个池中创建子进程

    p.close()

    这里加阻塞,直到进程池中所有的子进程执行完毕

    p.join()

    # (1) 比较pool 和Process 执行速度
    '''因为进程池可以实现并行的概念,比Process单核并发的速度要快'''
    '''
    import os,time
    from multiprocessing import Pool,Process
    
    def func(num):
        print("发了第%s封邮件" % (num))
        
    if __name__ == "__main__":
        # print(os.cpu_count()) # 获取cpu核心数量
        start = time.time()
        p  = Pool(6)  # 6核心
        for i in range(100):
            # apply_async 用来开启子进程
            p.apply_async(func,args=(i,))
    
        # 关闭进程池,用户不能在向这个池中创建子进程
        p.close() 
        # 这里加阻塞,直到进程池中所有的子进程执行完毕
        p.join()
        end = time.time()
        print(end-start)
            
        # 单核Process处理100件任务
        start = time.time()
        lst = []
        for i in range(100):
            p = Process(target=func,args= ( i ,))
            p.start()
            lst.append(p)
        for p in lst:
            p.join()
        end = time.time()
        print(end-start)
    # 运行完,会发现,并行比单核并发快很多
    View Code

    (4) 进程池.map (与高阶函数map使用方法一样,只不过这个是并发版本)

    import os
    from multiprocessing import Process
    
    def task(num):
    
        time.sleep(1)
    
        print("%s:%s"%(num,os.getpid())) #获取子线程号
    
        return num ** 2
    
    if __name__ == "__main__":
    
        p = Pool()
    
        res = p.map(task,range(20)) #自动close和join
    
        print(res)
    
    结果[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
    
     
    View Code

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Django实战(4):scaffold生成物分析
    Django实战(3):Django也可以有scaffold
    创建第一个模型类
    1. 实战系列的开发目标
    Django第一步
    URLconf+MTV:Django眼中的MVC
    mp4文件格式解析
    傅里叶分析之掐死教程(完整版)更新于2014.06.06
    关于Spinlock机制的一点思考
    spinlock变量没有初始化
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787245.html
Copyright © 2011-2022 走看看