zoukankan      html  css  js  c++  java
  • concurrent.futures 使用及解析

    from concurrent.futures import ThreadPoolExecutor, as_completed, wait, FIRST_COMPLETED
    from concurrent.futures import Future
    from multiprocessing import Pool
    
    #未来对象,task的返回容器
    
    
    #线程池, 为什么要线程池
    #主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
    #当一个线程完成的时候我们主线程能立即知道
    #futures可以让多线程和多进程编码接口一致
    import time
    
    def get_html(times):
        time.sleep(times)
        print("get page {} success".format(times))
        return times
    
    
    
    executor = ThreadPoolExecutor(max_workers=2)
    #通过submit函数提交执行的函数到线程池中, submit 是立即返回
    # task1 = executor.submit(get_html, (3))
    # task2 = executor.submit(get_html, (2))
    
    
    #要获取已经成功的task的返回
    urls = [3,2,4]
    all_task = [executor.submit(get_html, (url)) for url in urls]
    wait(all_task, return_when=FIRST_COMPLETED)
    print("main")
    
    # for future in as_completed(all_task): #谁先完成,谁先打印
    #     data = future.result()
    #     print("get {} page".format(data))
    
    #通过executor的map获取已经完成的task的值,顺序
    # for data in executor.map(get_html, urls):
    #     print("get {} page".format(data))
    
    
    # #done方法用于判定某个任务是否完成
    # print(task1.done())
    # print(task2.cancel())
    # time.sleep(3)
    # print(task1.done())
    #
    # #result方法可以获取task的执行结果
    # print(task1.result())

    多进程

    import time
    from concurrent.futures import ThreadPoolExecutor, as_completed
    from concurrent.futures import ProcessPoolExecutor
    #多进程编程
    #耗cpu的操作,用多进程编程, 对于io操作来说, 使用多线程编程,进程切换代价要高于线程
    
    #1. 对于耗费cpu的操作,多进程由于多线程
    # def fib(n):
    #     if n<=2:
    #         return 1
    #     return fib(n-1)+fib(n-2)
    #
    # if __name__ == "__main__":
    #     with ThreadPoolExecutor(3) as executor:
    #         all_task = [executor.submit(fib, (num)) for num in range(25,40)]
    #         start_time = time.time()
    #         for future in as_completed(all_task):
    #             data = future.result()
    #             print("exe result: {}".format(data))
    #
    #         print("last time is: {}".format(time.time()-start_time))
    
    #2. 对于io操作来说,多线程优于多进程
    def random_sleep(n):
        time.sleep(n)
        return n
    
    if __name__ == "__main__":
        with ProcessPoolExecutor(3) as executor:
            all_task = [executor.submit(random_sleep, (num)) for num in [2]*30]
            start_time = time.time()
            for future in as_completed(all_task):
                data = future.result()
                print("exe result: {}".format(data))
    
            print("last time is: {}".format(time.time()-start_time))
  • 相关阅读:
    PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件
    PlantUML类图
    Java 基于log4j的日志工具类
    RabbitMQ Hello world(二)
    redis lua 初体验
    mysql 批处理 innodb_flush_at_trx_commit 测试分析
    mysql 服务日志 5.7.29
    redis 浅谈事务
    redis list 基本操作
    redis hash 基本操作
  • 原文地址:https://www.cnblogs.com/Erick-L/p/8919913.html
Copyright © 2011-2022 走看看