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

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的使用)