• (10)进程池


    进程池不能无限开,线程也是不能无限开

    因此就诞生了池的概念

    这个池里面放了一定的数量的进程数或者线程数

    进程池的设置

    import os
    import time
    from multiprocessing import Pool #开启进程池要倒入Pool函数

    def task(i):
    print(i)
    time.sleep(1)

    if __name__ == '__main__':
    print(os.cpu_count()) # 查看CPU数量
    start = time.time()
    '''这个参数传的是CPU个数 +1,这个值不设置就是默认CPU个数+1'''
    p = Pool(5) #实例化5个进程,一次只能执行5个进程
    '''map是异步的'''
    p.map(task,range(20)) #这个就是相当于进程里面的start,开启的进程总数数,这里两个参数,一个是要执行的函数,一个是可迭代的对象
    p.close() #这个代表就是不能再往进程池里提交任务
    p.join() #等待子进程执行完毕
    end = time.time()
    print(start-end)

    开启多进程的两种方式以及效率对比

    def task(i):
    print(1)


    if __name__ == '__main__':
    print(os.cpu_count()) # 查看CPU数量
    start = time.time()
    '''这个参数传的是CPU个数 +1,这个值不设置就是默认CPU个数+1'''
    p = Pool(5) #定义进程池的数量,一次同时只能执行5个进程
    '''map是异步的'''
    p.map(task,range(20)) #这个就是相当于进程里面的start,开启的进程总数数,这里两个参数,一个是要执行的函数,一个是可迭代的对象
    p.close() #这个代表就是不能再往进程池里提交任务
    p.join() #等待子进程执行完毕
    end = time.time()
    print(end - start)

    start = time.time()
    p_l = []
    for i in range(20):
    p = Process(target=task,args=(i,))
    p_l.append(p)
    p.start()
    for p in p_l:
    p.join()
    print(time.time() -start)

    PS:进程池开启子进程任务的执行效率要高于for循环开启子进程的效率,因为进程池是根据CPU的数量+1来指定同时进程的数量,而for循环的底层原理是一次一次开启,所以效率没有进程池高

    进程池了解知识

    进程池apply方法

    apply方法

    import os
    import random
    import time
    from multiprocessing import Pool


    def task(i):
    i += 1
    print(i)
    time.sleep(random.randint(1,3)) #用这个就可以看到是同步执行的


    if __name__ == '__main__':
    print(os.cpu_count()) # 查看CPU数量
    start = time.time()
    p = Pool(5)
    '''apply是同步的,并不是异步的,所以效率并不会很高'''
    for i in range(20):
         '''apply里面有两个参数,一个是funcname(执行的函数名),一个是迭代对象'''
    p.apply(task,args=(i,)) #这个就是同步的
    end = time.time()
    print(end - start)
    apply_async方法

    import os
    import random
    import time
    from multiprocessing import Pool


    def task(i):
    i += 1
    print(i)
    time.sleep(random.randint(1,3))


    if __name__ == '__main__':
    start = time.time()
    p = Pool(5)
    res_l = []
    '''apply_async是异步的'''
    for i in range(20):
    res = p.apply_async(task,args=(i,)) #这个方法就是把执行的结果值放入队列
    res_l.append(res) #把值放入列表
    for res in res_l: #for循环加get取值
    res.get()
    end = time.time()
    print(end - start)
  • 相关阅读:
    redis几种模式的部署(Windows下实现)
    servlet容器:jetty,Tomcat,JBoss
    redis三种模式对比
    Linux expect详解
    expect学习笔记及实例详解
    shell expect的简单实用
    【Spring Boot】内嵌容器
    java 怎么让打印信息换行?
    Java中的静态方法是什么?
    java的接口为什么不能实例化
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10271672.html
Copyright © 2020-2023  润新知