• 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))
  • 相关阅读:
    记忆的永恒
    放弃我是你的错
    献给我逝去的长辈们清明
    思维的局限,穷人为什么会穷?
    借我一生
    陪你到老
    风雨路途
    人生的十二大财富
    怀才不遇
    javascript变量
  • 原文地址:https://www.cnblogs.com/Erick-L/p/8919913.html
Copyright © 2020-2023  润新知