• python3 进程池的异步调用


    # coding:utf-8
    import os
    import time
    from multiprocessing import Pool
    
    
    def func(n):
        print("%s:%s" % (os.getpid(), n))
        return n**2
    
    
    def func2(n):
        print("%s:%s" % (os.getpid(), n))
        time.sleep(1)
        return n**2
    
    
    if __name__ == '__main__':
        start_time = time.time()
        pool = Pool(5)  # 进程池中从无到有创建5个进程,以后一直是这5个进程在执行任务
        res_lst = []
        for i in range(10):
            res = pool.apply_async(func, args=(i,))  # 异步运行,根据进程池中有的进程数,每次最多3个子进程在异步执行,并且可以执行不同的任务,传送任意的参数了。
                                              # 返回结果之后,将结果放入列表,归还进程,之后再执行新的任务
                                              # 需要注意的是,进程池中的三个进程不会同时开启或者同时结束
                                              # 而是执行完一个就释放一个进程,这个进程就去接收新的任务。
            res_lst.append(res)
            # 异步apply_async用法:如果使用异步提交的任务,主进程需要使用join,等待进程池内任务都处理完,然后可以用get收集结果
            # 否则,主进程结束,进程池可能还没来得及执行,也就跟着一起结束了
        pool.close()  # 不是关闭进程池,而是结束进程池接收任务,确保没有新任务再提交过来。
        pool.join()  # 感知进程池中的任务已经执行结束,只有当没有新的任务添加进来的时候,才能感知到任务结束了,所以在join之前必须加上close方法
        print([r.get() for r in res_lst])  # 使用get来获取apply_aync的结果,如果是apply,则没有get方法,因为apply是同步执行,立刻获取结果,也根本无需get
        print("无阻塞程序的执行时间:", time.time() - start_time)
    
        s_time = time.time()
        pool2 = Pool(5)  # 进程池中从无到有创建5个进程,以后一直是这5个进程在执行任务
        res_lst = []
        for i in range(10):
            res = pool2.apply_async(func2, args=(i,))
            res_lst.append(res)
        pool2.close()
        pool2.join()
        print([r.get() for r in res_lst])
        print("有阻塞程序的执行时间:", time.time() - s_time)
    
    
    # 8860:0
    # 8860:1
    # 8860:2
    # 8860:3
    # 8860:4
    # 8860:5
    # 8860:6
    # 8860:7
    # 8860:8
    # 8860:9
    # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    # 无阻塞程序的执行时间: 0.609375
    # 7728:0
    # 3668:1
    # 7288:2
    # 8300:3
    # 10168:4
    # 7728:5
    # 3668:6
    # 7288:7
    # 8300:8
    # 10168:9
    # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    # 有阻塞程序的执行时间: 2.625
  • 相关阅读:
    JetBrains注册码计算(IntelliJ IDEA 15.0注册码激活)
    java分页数据导出excel
    linux系统关机与重新启动命令
    无向图的连通性分析
    流域水文模拟
    深信服笔试题(网络project师售后)
    CSS这些代码你都不会,你还有什么好说的!!!
    springMVC3学习(四)--訪问静态文件如js,jpg,css
    POJ 3311 Hie with the Pie(状压DP + Floyd)
    NSDictionary所有API的学习。
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10986603.html
Copyright © 2020-2023  润新知