zoukankan      html  css  js  c++  java
  • 进程池-限制同一时间在CPU上运行的进程数

    if __name__=='__main__' :  为了区分你是主动执行这个脚本,还是从别的地方把它当做一个模块去调用。

    如果是主动执行,则执行。如果是调用的,则不执行主体。

    1. 串行:切记切记:pool.close()必须在pool.join() 之前。

    from  multiprocessing import Process,Pool
    import time
    import os
    
    def Foo(i):
        time.sleep(1)
        print('in process',os.getpid())
        return i + 100
    
    def Bar(arg):
        print('-->exec done:', arg)
    
    if __name__=='__main__':
        pool = Pool(processes=5) #允许进程池里同时放入5个进程.虽然启用了10个,但是CPU只允许5个同时运行。其他的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.join()  # 进程池中进程执行完毕后再关闭,如果没有这句,那么程序不等进程执行完就直接关闭了。
    

     运行结果:

    in process 13460
    in process 5804
    in process 8488
    in process 10076
    in process 12604
    in process 13460
    in process 5804
    in process 8488
    in process 10076
    in process 12604
    end
    

     2. 5个一组并行执行

    from  multiprocessing import Process,Pool
    import time
    import os
    
    def Foo(i):
        time.sleep(1)
        print('in process',os.getpid())
        return i + 100
    
    def Bar(arg):
        print('-->exec done:', arg)
    
    if __name__=='__main__':
        pool = Pool(processes=5) #允许进程池里同时放入10个进程.虽然启用了5个,但是CPU只允许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.join()  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    

     运行结果:

    end
    in process 11276
    in process 8760
    -->exec done: 100
    -->exec done: 102
    in process 12316
    -->exec done: 101
    in process 10916
    -->exec done: 103
    in process 13648
    -->exec done: 104
    in process 8760
    -->exec done: 106
    in process 11276
    -->exec done: 105
    in process 12316
    -->exec done: 107
    in process 10916
    -->exec done: 108
    in process 13648
    -->exec done: 109
    

    3. 通过进程号得知,运行callback的是主进程

    from  multiprocessing import Process,Pool
    import time
    import os
    
    def Foo(i):
        time.sleep(1)
        print('in process',os.getpid())
        return i + 100
    
    def Bar(arg):
        print('-->exec done:', arg,os.getpid())
    
    if __name__=='__main__':
        pool = Pool(processes=5) #允许进程池里同时放入10个进程.虽然启用了5个,但是CPU只允许5个同时运行。
        print("主进程",os.getpid())
        for i in range(10):
            pool.apply_async(func=Foo, args=(i,), callback=Bar) #并行callback=回调,意思是执行完func=Foo以后,再执行callback=Bar.是主进程执行的回调。
            #pool.apply(func=Foo, args=(i,))  #串行
    
        print('end')
        pool.close()
        pool.join()  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    

    运行结果:每个进程执行完,都执行callback

    主进程 5160
    end
    in process 15512
    -->exec done: 102 5160
    in process 14180
    -->exec done: 100 5160
    in process 15748
    -->exec done: 101 5160
    in process 15844
    -->exec done: 103 5160
    in process 13716
    -->exec done: 104 5160
    in process 15512
    in process 14180
    -->exec done: 105 5160
    -->exec done: 106 5160
    in process 15748
    -->exec done: 107 5160
    in process 15844
    -->exec done: 108 5160
    in process 13716
    -->exec done: 109 5160
    
  • 相关阅读:
    SQL Server2008中删除重复记录
    Php环境在Windows (server 2003) 服务器部署标准 白丁简明版
    国外服务器鸟文windows,时间12小时制,如何改成24小时呢?我来告诉你
    将Capicom调用代码封装到ActiveX——解决javascript调Capicom读取数字证书信息时,IE弹出安全提示的问题
    Linq处理List数据
    C#将窗口最小化到系统托盘,并显示图标和快捷菜单
    C# 将程序添加到启动项 (写入注册表),及从启动项中删除
    C#中string[]数组和list<string>泛型的相互转换
    IIS7.5部署ASP.NET失败
    IIS 7.5版本中一些诡异问题的解决方案
  • 原文地址:https://www.cnblogs.com/momo8238/p/7358969.html
Copyright © 2011-2022 走看看