• 进程池


    启动太多个进程,会使系统运行快速变慢,因为相当于克隆了父进程数据,使内存资源开销变大,容易将系统搞瘫。(多线程开销很下,只是使cpu的切换过于频繁,导致系统变慢)

    进程池(同一时间有多少进程在CPU上运行)  

    进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

    进程池中有两个方法:

    • apply  串行,也叫同步执行
    • apply_async  并行,也叫异步执行
    #适合linux开启的进程池,在windows上需要导入freeze_support
    from  multiprocessing import Process, Pool#Pool游泳池的意思
    import time,os
    
    def Foo(i):
        time.sleep(2)
        print('in process',os.getpid())
        return i + 100
    
    def Bar(arg):
        print('-->exec done:', arg)
    
    pool = Pool(5)
    
    for i in range(10):
        pool.apply_async(func=Foo, args=(i,), callback=Bar)#并行
        # pool.apply(func=Foo, args=(i,))#串行
    
    print('end')
    pool.close()#记得要把pool关闭掉
    #注意先close,再join
    pool.join()  # 进程池中所有进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    

      

    #适合windows开启的进程池,在linux上不需要导入freeze_support
    from  multiprocessing import Process, Pool,freeze_support
    import time,os
    
    def Foo(i):
        time.sleep(2)
        print('in process',os.getpid())
        return i + 100
    
    def Bar(arg):
        print('-->exec done:', arg,' 子进程pid:',os.getpid())
    
    if __name__ == '__main__':#在windows上启动线程池,必须加本句。
    #一般程序中本句的作用是为了区分是主动执行这个脚本,还是从别的地方把它当做一个模块去调用。
    #如果主动执行这个脚本,下面的代码就执行。如果别人从别的代码里导入本篇程序,就不执行本句内的程序。
    #所以本句内的内容只能手动执行这个脚本,用于测试之类。
    # 如果不手动执行,被别的地方(本篇程序之外)的程序调用(直接import本篇程序名),就不会执行本句内内容。
    
        pool = Pool(5)#允许进程池同时放入5个进程,真正调用CPU被允许运行的只有放在进程池里的5个进程。
        # pool = Pool(processes=5)#同上句
        print('主进程的pid:',os.getpid())
        for i in range(10):#启动了10个进程,但是进程池只允许5个运行,其余5个被挂起,但也启动了。
            # pool.apply_async(func=Foo, args=(i,))#并行的结果是5个5个的执行
            # pool.apply(func=Foo, args=(i,))#串行的运行结果是一个一个执行
            pool.apply_async(func=Foo, args=(i,), callback=Bar)#callback:回调,func执行完了就执行callback
            # 注:回调是主进程执行的,不用在子进程中,这样会提高效率,因为主进程pid和子进程pid是相同的。
        print('end')#如果没有join,结果只有本句
        pool.close()#记得要把pool关闭掉
        #注意先close,再join
        pool.join()  # 进程池中所有进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    

      结果:

    主进程的pid: 6216
    end
    in process 6716
    -->exec done: 100  子进程pid: 6216
    in process 3316
    -->exec done: 101  子进程pid: 6216
    in process 6304
    -->exec done: 102  子进程pid: 6216
    in process 6332
    -->exec done: 103  子进程pid: 6216
    in process 6824
    -->exec done: 104  子进程pid: 6216
    in process 6716
    -->exec done: 105  子进程pid: 6216
    in process 3316
    -->exec done: 106  子进程pid: 6216
    in process 6304
    -->exec done: 107  子进程pid: 6216
    in process 6332
    -->exec done: 108  子进程pid: 6216
    in process 6824
    -->exec done: 109  子进程pid: 6216
    View Code
  • 相关阅读:
    xcode6新建pch文件过程
    系统提供的dispatch方法
    iOS 默认Cell选中
    sqoop部署
    maven自动化部署插件sshexec-maven-plugin
    spring-7、Spring 事务实现方式
    Spring-6.1、Java三种代理模式:静态代理、动态代理和cglib代理
    spring-6、动态代理(cglib 与 JDK)
    spring -3、spring 的 IOC与AOP
    Spring-2、Spring Bean 的生命周期
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/9442076.html
Copyright © 2020-2023  润新知