美文网首页
多线程中线程池concurrent future的使用

多线程中线程池concurrent future的使用

作者: ___大鱼___ | 来源:发表于2019-05-30 14:29 被阅读0次
    from concurrent.futures import ThreadPoolExecutor, as_completed, wait
    import time
    
    # 线程池  为什么要线程池?
    # 主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
    # 当一个线程结束后主线程能立刻知道线程结束了
    # futures 可以让多线程和多进程接口一致
    
    
    def get_html(times):
        time.sleep(3)
        print('thread is successed', times)
        return '完成了'
    
    
    if __name__ == '__main__':
        executor = ThreadPoolExecutor(max_workers=3)
    
        # result = task1.done()
        # is_cancel = task2.cancel()  # 取消线程运行  返回结果是 是否被取消  如果线程已经启动或者结束是不能被取消的
        # print(task1)
        # print(result)
        # time.sleep(3)
        # result1 = task1.done()  # done方法判断是否执行完成
        # print(task1.result())  # result方法获取函数返回值
        # print(result1)
    
        # 一次提交多个线程的做法
        urls = ['https://www.zhijinyu.com/{}'.format(x) for x in range(10)]
        all_tasks = [executor.submit(get_html, url) for url in urls]  # 提交多个线程
        print(all_tasks)
        wait(all_tasks, return_when='FIRST_COMPLETED')  # 阻塞所有线程完成才执行后面的问题   有一个参数叫return_when  什么时候继续执行
        """
         return_when: Indicates when this function should return. The options
                are:
    
                FIRST_COMPLETED - Return when any future finishes or is  # 第一个执行完毕
                                  cancelled.  # 
                FIRST_EXCEPTION - Return when any future finishes by raising an    # 通过提出future,在任何future结束时返回。 如果没有将来会引发异常,那么它等同于ALL_COMPLETED。
                                  exception. If no future raises an exception
                                  then it is equivalent to ALL_COMPLETED.
                ALL_COMPLETED -   Return when all futures finish or are cancelled.
            """
        print('main')
        # for future in as_completed(all_tasks):   # 获取所有线程的执行结果
        #     data = future.result()
        #     print(data)
    
    
        # # 通过executor获取已经完成的task
        # for future in executor.map(get_html, urls):   # map返回的顺序和url的顺序是一致的
        #
        #     print(future)
    
    
    
    

    相关文章

      网友评论

          本文标题:多线程中线程池concurrent future的使用

          本文链接:https://www.haomeiwen.com/subject/pvxvtctx.html