zoukankan      html  css  js  c++  java
  • 多线程与多进程的比较

    多线程适合于多io操作

    多进程适合于耗cpu(计算)的操作

    # 多进程编程
    # 耗cpu的操作,用多进程编程, 对于io操作来说,使用多线程编程
    import time
    from  concurrent.futures import ThreadPoolExecutor, as_completed
    from  concurrent.futures import ProcessPoolExecutor
    
    
    def fib(n):
        if n <= 2:
            return 1
        return fib(n - 2) + fib(n - 1)
    
    if __name__ == '__main__':
    
        # 1. 对于耗cpu操作,多进程优于多线程
    
        # with ThreadPoolExecutor(3) as executor:
        #     all_task = [executor.submit(fib, num) for num in range(25, 35)]
        #     start_time = time.time()
        #     for future in as_completed(all_task):
        #         data = future.result()
        #         print(data)
        #     print("last time :{}".format(time.time() - start_time))  # 3.905290126800537
    
    
        
        # 多进程 ,在window环境 下必须放在main方法中执行,否则抛异常
        with ProcessPoolExecutor(3) as executor:
            all_task = [executor.submit(fib, num) for num in range(25, 35)]
            start_time = time.time()
            for future in as_completed(all_task):
                data = future.result()
                print(data)
            print("last time :{}".format(time.time() - start_time))  # 2.6130592823028564

    可以看到在耗cpu的应用中,多进程明显优于多线程     2.6130592823028564 < 3.905290126800537

    下面模拟一个io操作

    # 多进程编程
    # 耗cpu的操作,用多进程编程, 对于io操作来说,使用多线程编程
    import time
    from  concurrent.futures import ThreadPoolExecutor, as_completed
    from  concurrent.futures import ProcessPoolExecutor
    
    def io_operation(n):
        time.sleep(2)
        return n
    
    
    if __name__ == '__main__':
    
        # 1. 对于耗cpu操作,多进程优于多线程
    
        # with ThreadPoolExecutor(3) as executor:
        #     all_task = [executor.submit(io_operation, num) for num in range(25, 35)]
        #     start_time = time.time()
        #     for future in as_completed(all_task):
        #         data = future.result()
        #         print(data)
        #     print("last time :{}".format(time.time() - start_time))  # 8.00358772277832
    
    
    
        # 多进程 ,在window环境 下必须放在main方法中执行,否则抛异常
        with ProcessPoolExecutor(3) as executor:
            all_task = [executor.submit(io_operation, num) for num in range(25, 35)]
            start_time = time.time()
            for future in as_completed(all_task):
                data = future.result()
                print(data)
            print("last time :{}".format(time.time() - start_time))  # 8.12435245513916
    可以看到 8.00358772277832 < 8.12435245513916, 即是多线程比多进程更牛逼!
  • 相关阅读:
    idea快捷键总结
    将对象序列化和反序列化
    在Springmvc中获取properties属性
    配置springmvc在其他类中(spring容器外)获取注入bean
    redis学习之三配置文件redis.conf 的含义
    redis学习之二from github
    敏捷开发方法XP的12个最佳实践
    IIS-网站发布之后访问HTTP 错误 403.14
    IIS-将iis直接指向.net代码会出现错误
    HTTP 错误 500.24
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/12064012.html
Copyright © 2011-2022 走看看